MySQL索引原理
2020-04-14 本文已影响0人
ce5154e79490
索引是帮助MySQL高效获取数据的排好序的数据结构
索引的数据结构:
-
image.png二叉树
:
-
红黑树
-
hash表
:通过计算hash值来存放数据,查找效率高,但是不适合范围查找 -
image.pngB-Tree
叶子节点具有相同的深度
叶子节点的指针为空
叶子节点的数据索引从左到右递增排序
-
image.pngB+Tree(B-Tree变种)
:
MySQL默认索引
非叶子节点不存储data,只存储索引,这样就可以存放更多的索引
叶子节点不存储指针
顺序访问指针,提高区间访问的性能
MyISAM索引文件和数据文件是分离的(非聚集)
MySQL的数据都存储在MySQL安装目录的data文件夹下,库名下面是表名,不同的后缀表示不同的文件。其中,对于MyISAMM,后缀为frm的是表结构信息,MYD是表中的数据,MYI是表对应的索引MySQL的数据都存储在MySQL安装目录的data文件夹下,库名下面是表名,不同的后缀表示不同的文件。其中,对于MyISAMM,后缀为frm的是表结构信息,MYD是表中的数据,MYI是表对应的索引
image.png
InnoDB索引实现(聚集)
-
表数据文件本身即是按B+Tree组织的一个索引结构文件
-
聚集索引的叶子节点包含了完整的数据记录
-
为什么InnoDB必须有主键,并且推荐使用自增主键?
因为: 主键用来做索引,整型是因为比较速度快(如果是字符串还得逐个比较,查ASCII码表);占用空间小,能存更多的索引(给每一个节点分配的内存大小是固定的);会导致树分裂,会破坏之前已经存储好的数据结构,效率很低 -
为什么非主键索引结构叶子节点存储的是主键值?(一致性和节省存储空间)
-
对于InnoDB,后缀为frm的是表结构信息,ibd文件是表中的数据和表对应的索引
聚集索引
:把数据和索引存储在同一个文件里面
非聚集索引
:把数据和索引存储在不同的文件里面