概述
目录
一、索引的本质
1.1 B-Tree
1.2 B+Tree (B-Tree的变种)
二、InnoDB索引实现(聚集)
三、联合索引结构
一、索引的本质
索引是帮助mysql高效的获取数据的排好序的数据结构。
注意, 这里说索引一定是排好序的, 而不是无序的。
索引数据结构常见的有:二叉树、红黑树、B-Tree、B+Tree
Mysql的索引使用的数据结构就是B+Tree;
1.1 B-Tree
- 叶节点具有相同的深度,叶节点的指针为空,每个节点都存储完整的data;
- 所有索引元素不重复;
- 节点中的数据索引从左到右递增排列
1.2 B+Tree (B-Tree的变种)
- 非叶子节点不存储data,只存储索引(冗余),可以放更多的索引;
- 叶子节点包含所有索引字段,包含该行的所有data;
- 叶子节点用指针连接,提高区间访问的性能;
数据库中 MyISAM索引文件和数据文件是分离的(非聚集),索引存在一个文件, 数据存在另一个文件。
二、InnoDB索引实现(聚集)
- 表数据文件本身就是按B+Tree组织的一个索引结构文件;
- 聚集索引-叶节点包含了完整的数据记录;
- InnoDB表必须有主键,并且推荐使用整型的自增主键; 如果没有显示设置主键,则mysql会在整个表中扫描是否有符合自增且唯一的一列,如果有,则将该列设置为主键, 如果找不到,mysql则会自动给该表加一个隐藏的自增主键列;
- 非主键索引结构叶子节点存储的是主键值,不存储其他元素(一致性和节省存储空间)
主键索引的结构
二级索引(非主键索引)的结构
三、联合索引结构
联合索引是指将表中非主键的多个字段组合成一个索引。
该索引的排序是按照索引中字段的顺序进行排序的,先进行索引中第一列进行排序, 如果第一列顺序相同,则会继续进行索引中第二列进行排序,直到排完索引中最后一列。
注意:排序比较时,null值默认排在最前面。
如有一个联合索引 (number,name,date), 那么索引排序时首先会根据number进行排序, 如果number顺序一致, 则再根据name进行排序, 如果name顺序也一致, 则按照date进行排序。
所以我们在sql中使用联合索引时,SQL决定是否需要走索引,是要根据索引最左前缀原理来的。
如果我们有一条sql语句,条件为 where number = 100 and date > '2021-08-06'.
则innodb存储引擎在执行该条件时, 根据 索引最左前缀原理,先根据number在索引数中定位=100的数据记录, 但是number=100的所有数据记录, 其date是无序的,只有当name相等时,其date才会是有序的, 所以这个where条件中date就不会再走索引了。
联合索引的结构
关于B-Tree和B+Tree大家不清楚的可以参考下这里:https://www.cnblogs.com/tiancai/p/13711878.html
最后
以上就是忐忑季节为你收集整理的MySql索引结构分析一、索引的本质二、InnoDB索引实现(聚集) 三、联合索引结构 的全部内容,希望文章能够帮你解决MySql索引结构分析一、索引的本质二、InnoDB索引实现(聚集) 三、联合索引结构 所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复