MySQL索引深入理解底层数据结构

定义:索引是帮助MYSQL高效排好序的数据结构

索引存储在文件里
形式:二叉树 HASH BTREE
为什么用BTREE而不用二叉树:

《MySQL索引深入理解底层数据结构》
如果每次的数据都是以1,2,3,4,5,6的形式添加,会造成二叉树单边增长,从而导致查询效率依然低下
红黑树会自己旋转,会有一个自平衡的过程,但是高度是不可控的,(height),如果是百万级别的数据,高度是完全不可控的

为什么用BTREE而不用HASH:HASH如果是单个查找条件会比较快,比如col=3,直接用hash(index=3)即可,但是范围查找的话效率很慢,大部分公司有很多业务都会是范围查找

《MySQL索引深入理解底层数据结构》

如果让你来设计MySQL的BTREE,你觉得degree设为多少合适?
设为磁盘I/O一个节点的值,假如一次I/O最多取4k,就设为4k,作均衡
B+TREE的优势:非叶子节点不存储数据,只存储key
《MySQL索引深入理解底层数据结构》
评价一个索引结构好坏的标准:磁盘I/O次数
预读:磁盘一般会顺序向后读取一定长度的数据(页的整倍数)放入内存
局部性原理:如果一个数据被用到了,那他附近的数据也马上会被用到
B+TREE的度一般会超过100,所以高度h会非常小(一般在3-5之间)
MyISAM索引实现:MyISAM索引文件和数据文件是分离的 存储引擎是表级别,不是数据库级别

《MySQL索引深入理解底层数据结构》
D–>Data I–>index
InnoDB–>聚集索引–>数据和索引是放在一起的–>是按主键索引构建的一个BTREE树
InnoDB–>推荐使用整型自增主键–>保证数据可以顺序插入到当前索引节点的后续位置,如果是用UUID,需要比较ASCII码,还有可能插入的地方空间不足需要分裂开,花费更多的时间
不建议使用过长的字段作为主键,因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大
为什么非主键索引结构叶子节点存储的是主键值?(一致性和节省存储空间)

    原文作者:SkinnyTracy
    原文地址: https://segmentfault.com/a/1190000019419783
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞