mysql刨根问底

索引:排好序的数据结构

二叉树:

红黑树

hash表:

b-tree:

   叶子相同深度,叶节点指针=空,索引元素不重复,从左到右递增排序

   节点带data

b+tree:

   非叶子节点只存储索引,可放更多索引

   叶子节点含all索引 用指针双向连接,提高区间访问性能

页大小16kb,2000w 高度3   3次磁盘io

   根节点常驻内存,减少磁盘io

引擎

innodb

    frm:           ibd:

   表数据文件本身按b+tree组织多索引结构文件

   聚集索引-叶节点含完整数据

myisam:索引/数据文件分离

    frm。 MYD。 MYI

    主键b+tree存储 data是地址引用,非聚集

explain少不了这个大佬

type关联类型或访问类型 

  mysql如何查找表中的行,system const  eq_ref  ref  range  index  all

  null:mysql在优化阶段分解查询语句,执行阶段不需要访问表 索引

  system,const:查询某部分优化并将其转化成一个常量

  eq_ref:primary key或unique_key 索引的all部分被连接使用,最多只会返回一条符合条件的记录

  ref:没有用唯一索引

不走索引:

   引擎本身不支持索引

   不等于 

   is null / is not null

   like 通配符: select 查询具体的列 

   复杂函数

   字符串不加单引号:类型转换

   or / in 查询时  不一定用索引,检索比例 表大小等因素不一定用索引

   范围查询优化

索引(a,b,c)

where a = 4 and b like 'kk%' and c=6;  //使用abc

where a = 4 and b like 'k%kk%' and c=7; //使用ab c

索引下推5.6后

trace工具:命令行打开 

  影响性能,分析执行计划

   sql准备阶段  格式化sql   

   sql优化阶段:去掉无意义语句

优化

order by与group by

 最左前缀法则,中间字段不能断

 using filesort 标识没走索引,order by * asc ,* desc  索引排序方式不同8后降序索引可以支持

  • using index指mysql扫描索引本身完成排序 效率高, filesort效率低没有用索引
  • order by使用索引最左前列 / where与order by条件组合满足索引最左前列
  •  尽量在索引列上完成排序,遵循索引建立时最左前缀法则
  • order by的条件不在索引列上,会产生using filesort
  • group by与order by类似,先排序后分组,索引创建顺序最左前缀法则
  • group by不需要排序可加group by null禁止排序

where 高于having,能写where中的限定条件就不要去having限定

filesort 文件排序

 单路排序:一次性取出满足条件的字段,sort buffer (1M)排序;trace看sort_mode显示sort_key additional_fields 或 sort_key,packed_additional_fields

 双路排序:回表排序,据相应条件取出排序字段和可直接定位的行数id,sort buffer排序,再次取需要的字段

  字段总长度 < max_length_for_sort_data,单路排序

  字段总长度 > max_length_for_sort_data,双路排序

索引设计原则

代码先行,索引后上

联合索引尽量覆盖

小基数字段不建索引:重复值少

长字符串前缀索引,order by和group by 中不能用

where与order by冲突时优先where

执行小表驱动大表

left  join左表驱动表  right join右边驱动表

   NLJ: 循环驱动表 读取关联字段  取出另一张被驱动表满足条件的数据,扫描磁盘

   BNL:驱动表数据读到join buffer中,被驱动表每一行取出与join buffer对比

   straight_join t1 on t2.a=t1.a 强制指定驱动表

      被驱动表的关联字段无索引的关联查询,BNL ;有索引NLJ

in:B表的数据集小于a表,in 优先exists

     select * from A where id in(select id from B);

exists当A表数据小于B,exists优先in

     select* from A where exists (select 1 from B where B.id=A.id)

count(*)  count(1)> count(字段) > count(id) 

  字段有索引:二级索引 ,比主键索引大小要小

  count(1) count(字段) 执行过程类似,count(1)不需要取字段

  count(*)做了优化,不取值 按行累加 效率高

查询mysql自己维护总行数

   myisam维护总行数,innodb不会存储总行数

show table status可查询表总行数

整型无负数,unsigned可扩大一倍

tinyint代替enum bitenum set

避免使用整数的显示宽度:不要int(10) 直接int,10是显示长度

decimal注意设置长度,精确计算

整形运算 存储实数:实数乘以相应的倍数后再操作

整数通常是最佳的数据类型:速度快 auto_increment

事务

原子  一致  隔离  持久

大事务

    并发时连接池撑爆/锁太多超时阻塞/

    执行时间长 主从延迟 /回滚时间长/undo log膨胀/易死锁

优化:

 查询放事务外 (rr除外) / 避免远程调用 设置超时 / 避免一次性处理太多数据  / 

 更新设计加锁操作尽可能放到事务靠后的位置/能异步尽量异步 /  应用保证数据一致性 

隔离级别:undo多版本链

select 快照读 历史数据

update  insert   delete 当前读,最新数据

读未提交:read uncommit

  脏读,

读已提交:read commit 

    乐观锁 行锁  语句级快照读

    tx_id:

    roll_pointer:undo log

可重复读:repeatable read

    不能用版本号标识 读的是之前的   事务级快照

    幻读:新增的数据

  查询需要加锁吗?rr  读同一时间维度  需要

串行:serializable 

  读了之后不能修改

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/287123.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java_15 删除排序数组中的重复项

删除排序数组中的重复项 给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的…

影视作品一键转成动漫,自媒体作者用DomoAI赢麻了

前言 众所周知&#xff0c;在自媒体爆火的那段时间&#xff0c;影视号是最容易起量的&#xff0c;借助高质量的影视&#xff0c;进行剪辑&#xff0c;解说&#xff0c;等二次创作&#xff0c;最终制作成高质量的作品&#xff0c;但是随着自媒体的发展&#xff0c;影视号越来越…

MyBatis是纸老虎吗?(七)

在上篇文章中&#xff0c;我们对照手动编写jdbc的开发流程&#xff0c;对MyBatis进行了梳理。通过这次梳理我们发现了一些之前文章中从未见过的新知识&#xff0c;譬如BoundSql等。本节我想继续MyBatis这个主题&#xff0c;并探索一下MyBatis中的缓存机制。在正式开始梳理前&am…

基于SpringBoot+MyBatis框架的智慧生活商城系统的设计与实现(源码+LW+部署+讲解)

目录 前言 需求分析 可行性分析 技术实现 后端框架&#xff1a;Spring Boot 持久层框架&#xff1a;MyBatis 前端框架&#xff1a;Vue.js 数据库&#xff1a;MySQL 功能介绍 前台功能拓展 商品详情单管理 个人中心 秒杀活动 推荐系统 评论与评分系统 后台功能拓…

测试小白必看:自动化测试入门基础知识

一、首先&#xff0c;什么是自动化测试&#xff1f; 自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程。通常&#xff0c;在设计了测试用例并通过评审之后&#xff0c;由测试人员根据测试用例中描述的规程一步步执行测试&#xff0c;得到实际结果与期望结果的比较…

Vuex状态、数据持久化(vue2、vue3状态数据持久化)

简介&#xff1a;Vuex是一个仓库&#xff0c;是vue的状态管理工具&#xff0c;存放公共数据&#xff0c;任何组件都可以使用vuex里的公共数据。Vuex提供了插件系统&#xff0c;允许我们使用 vuex-persistedstate插件&#xff0c;将Vuex的状态持久化到本地存储中&#xff0c;解决…

【工具篇】总结比较几种绘画软件的优缺点

目录 一、Visio二、Processon三、draw.io四、亿图图示五、wps 写在文章开头&#xff0c;感谢你的支持与关注&#xff01;小卓的主页 一、Visio Visio 是微软公司开发的一款流程图和图表绘制软件。我们可以用它来创建各种类型的图表&#xff0c;如流程图、组织结构图、网络图、平…

【python从入门到精通】-- 第二战:注释和有关量的解释

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;python从入门到精通&#xff0c;魔法指针&#xff0c;进阶C&#xff0c;C语言&#xff0c;C语言题集&#xff0c;C语言实现游戏&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持创作博文…

java的一些内部小知识,类与对象的关系

目录 1. java2. 类与对象的关系 1. java test.java ---- javac --> Test.class ---- java-----> 内存 ----> cpu 源文件 二进制代码 所有正在运行的软件都在内存中有自己的内存空间 jvm —>运行java程序的&#xff0c;java虚拟机 main(); // 内部调用run()run(i…

Fiddler抓包工具之fiddler的常用快捷键

一、常用三个快捷键 ctrlX :清空所有记录 CtrlF&#xff1a;查找 F12&#xff1a;启动或者停止抓包 使用 QuickExec Fiddler2 成了网页调试必备的工具&#xff0c;抓包看数据。Fiddler2自带命令行控制。 fiddler 命令行快捷键&#xff1a;ctrl q &#xff0c;然后 输入 help…

QTday5

头&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimerEvent> //定时器事件 #include <QTime> //时间类 #include <QtTextToSpeech> //文本转语音类 #include <QMouseEvent> //鼠标事件类 QT_BEGIN_NAMESPACE …

Redis锁,乐观锁与悲观锁

锁 悲观锁 认为什么时候都会出问题&#xff0c;无论做什么都会加锁 乐观锁 很乐观&#xff0c;认为什么时候都不会出问题&#xff0c;所以不会上锁。 更新数据时去判断一下&#xff0c;在此期间&#xff0c;是否有人修改过这个数据 应用于&#xff1a;秒杀场景 **watch*…

【保姆级讲解Edge兼容性问题解决方法】

&#x1f308;个人主页:程序员不想敲代码啊&#x1f308; &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家&#x1f3c6; &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d; 希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提…

新人应该从哪几个方面掌握大数据测试?

什么是大数据 大数据是指无法在一定时间范围内用传统的计算机技术进行处理的海量数据集。 对于大数据的测试则需要不同的工具、技术、框架来进行处理。 大数据的体量大、多样化和高速处理所涉及的数据生成、存储、检索和分析使得大数据工程师需要掌握极其高的技术功底。 需要你…

【Java程序设计】【C00366】基于(JavaWeb)Springboot的纹理生产图片系统(有论文)

TOC 博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;已经做了六年的毕业设计程序开发&#xff0c;开发过上千套毕业设计程序&#xff0c;博客中有上百套程序可供参考&#xff0c;欢迎共同交流学习。 项目简介 项目获取 &#x1f345;文末点击卡片…

MySQL 经典练习 50 题 (记录)

前言&#xff1a; 记录一下sql学习&#xff0c;仅供参考基本都对了&#xff0c;不排除有些我做的太快做错了。里面sql不存在任何sql优化操作&#xff0c;只以完成最后输出结果为目的&#xff0c;包含我做题过程和思路最后一行才是结果。 1.过程: 1.1.插入数据 /* SQLyog Ul…

STM32之HAL开发——手动移植HAL库

HAL库移植步骤 创建目录 配置启动文件 在\Drivers\CMSIS\Device\ST\stm32f1xx\Source\Templates\ARM目录下&#xff0c;根据你的芯片型号选择对应的启动文件&#xff0c;不同容量大小的芯片&#xff0c;对应的启动文件也不一样。 注意&#xff1a;在HAL库中&#xff0c;不同容…

centos7二进制安装openstack train版本双网口五节点

这里写目录标题 材料准备宿主机安装KVM 网络规划硬件规划本案例局限性密码规划虚拟机准备网络准备centos7模板机准备 数据库安装安装rabbitMQ消息队列安装memcached服务安装Etcd安装keystone身份服务创建数据库用户keystone安装keystone组件创建admin并启动keystone监听验证key…

canvas画带透明度的直线和涂鸦

提示&#xff1a;canvas画线 文章目录 前言一、带透明度的直线和涂鸦总结 前言 一、带透明度的直线和涂鸦 test.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content…

堆排序(六大排序)

前面博客已经分享过堆的知识了&#xff0c;今天我们来分享堆排序。 堆排序 堆排序(Heapsort)是指利用堆积树&#xff08;堆&#xff09;这种数据结构所设计的一种排序算法&#xff0c;它是选择排序的一种。它是通过堆来进行选择数据。 ★★★需要注意的是排升序要建大堆&#…