mysql页面存储结构和索引优化细节

mysql的页的存储方式

mysql的页中有是有很多个行的。
数据是以行格式存储。默认的行格式是dynimc
记录行的头部存储了变长字段长度的列表,null值列表,头信息,然后是每个字段的值。
每个行都有下一条记录的相对位置,nextrecord形成双向链表。
每一页会有系统生成一个最小记录和最大记录固定不变。infimum和supremum。查询的时候查询id是否在这两个记录的范围内
页会把这些双向链表分组。
第一条记录infimum单独一组,其他记录4-8条一组。最大是8,到达第八条会拆成2个4。
n_owned代表一个组内有多少条记录。
每一组中最后一条记录称为槽,这个槽是页的目录。
如果要在一个页中查找数据。就是通过二分查找指定的槽。查到了后编辑组中的记录。

页目录(页中最小的id和页面编号组成,mysql的页不是顺序存储,页编号可能乱序1后面是页可能是9)
多个页目录组成一个页也是16KB

简单描述mysql的全表扫描过程

1磁盘加载页面到内存中也就是IO-16KB一页 存在页面的预读会有多个页面
2根据在第一层页目录查询检索到第二级的页编号,在第二层的页目录根据id查到第三层的页编号。
3一直找到在底层的指定页编号的数据页(行数据)二分查询判断页的最小id记录和要查询的id小还是大来来决定向哪边遍历
3根据上面的二分查到指定的页后,页中有多个组。二分查询组记录中最大的值,同样决定左右遍历顺序
4查到页中指定的组,在组内遍历得到指定id的记录如果是则取出中断扫描

第一次磁盘IO:将磁盘块1读入内存,在内存中定位(与17,35比较);
第二次磁盘IO:将磁盘块2读入内存,在内存中定位(与8,12比较);
第三次磁盘IO:将磁盘块7读入内存,在内存中定位(与13,15比较);
在这里插入图片描述

mysql索引

最左前缀法则

意思是 abc联合索引
ab 和ba都能用上索引 abc cba顺序打乱mysql会自动优化索引的顺序。
但是如果b,bc,c,这样的话是用不上索引的。

细节

1查询二级索引的时候扫描的预估扫描行数很重要,因为代表了他会回表的次数,很多时候慢是这个原因。
2mysql的all全表扫描其实就是对主键索引的树进行遍历。遍历过程可以看从根上了解mysql。其实就是多个二分查找
3status,type这种基数少的字段建立单索引意义不大,容易全表。但是和别的字段建立联合索引,两个字段组合的基数会变大,也更容易用到索引,是可以使用的

索引下推

mysql根据一个索引条件查到索引数据后,不回表。直接根据第二个条件的索引查询过滤得到结果就是索引下推。速度也很快。但是只有联合索引能用。

explain分析计划的type=index

这种是对二级索引全部扫描,性能跟all差不多,稍微快一点,只是因为二级索引的数据量比主键索引存的少

count(*)的优化

count查询mysql有优化,直接根据最优的二级索引去查询。因为主键索引底层存储的数据量比较大速度不如二级索引。因为只需要统计数量

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值