一、本质:索引是帮助Mysql高效获取数据的排好序的 数据结构。
二、索引数据结构:(图一)示例图二叉树
缺点:当节点是递增的情况下(如图一的Col1字段),二叉树会类似成一个链表(如下图),查询d的效率跟没有添加索引的时候是一样的。二叉树的弊端红黑树
原理:当父节点右边的节点数减去左边的节点数等于2的时候,红黑树会自动平衡,性能比二叉树好点。红黑树相当于平衡二叉树。
缺点:当数据量比较大的时候,红黑树的高度会越高,查询效率会越低。(树的高度越高,io查询次数越多)红黑树(平衡二叉树)B-TreeB-Tree结构B+ Tree:Mysql索引底层使用的数据结构。B+Tree结构
B+Tree 和B-Tree的区别:
(1) B+Tree 非叶子节点没有data元素(好处:Mysql默认一个节点最多可以存储16k, 非叶子节点不存储data元素,可以有更多的空间去存储索引,使得索引查询更快。)
(2) B+Tree 叶子节点之间有指针(好处:提高区间访问的性能。)
MyISAM存储引擎索引实现:
Myisam的索引文件的data元素是存储数据文件所在行的磁盘文件地址指针。
Innodb存储引擎索引实现(聚集):
Innodb索引的data元素是存放所在行的其他字段数据。
聚集索引:叶子节点包含了完整的数据记录(聚集索引是指索引和数据包含在一起)
为什么Innodb表必须有主键,并且推荐整型的自增主键?
数据查询是需要比较的,用整型的数据当主键,比较的效率更快(整型数据比字符串数据比较效率快,而且存储空间小)。
使用自增主键的目的是为了避免数据索引在更新的时候,对整个B+Tree的重新排序。