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

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


索引存储在文件里
形式:二叉树 HASH BTREE
为何用BTREE而不用二叉树:数据结构

clipboard.png
若是每次的数据都是以1,2,3,4,5,6的形式添加,会形成二叉树单边增加,从而致使查询效率依然低下
红黑树会本身旋转,会有一个自平衡的过程,可是高度是不可控的,(height),若是是百万级别的数据,高度是彻底不可控的spa

为何用BTREE而不用HASH:HASH若是是单个查找条件会比较快,好比col=3,直接用hash(index=3)便可,可是范围查找的话效率很慢,大部分公司有不少业务都会是范围查找设计

clipboard.png


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

clipboard.png
D-->Data I-->index
InnoDB-->汇集索引-->数据和索引是放在一块儿的-->是按主键索引构建的一个BTREE树
InnoDB-->推荐使用整型自增主键-->保证数据能够顺序插入到当前索引节点的后续位置,若是是用UUID,须要比较ASCII码,还有可能插入的地方空间不足须要分裂开,花费更多的时间
不建议使用过长的字段做为主键,由于全部辅助索引都引用主索引,过长的主索引会令辅助索引变得过大
为何非主键索引结构叶子节点存储的是主键值?(一致性和节省存储空间)ip

相关文章
相关标签/搜索