核心参考:B站数据库索引视频
索引是帮助数据库高效获取数据的排好序的数据结构。(是一种数据结构,如二叉树、红黑树、Hash表和B-Tree等)。
相关数据结构
- 二叉树:比起按顺序挨个扫描有一定的优化。但是底层不用,因为会形成只有一个儿子的树。
- 红黑树:比起二叉树形成单链有一定的优化。但是底层不用,因为有更好的办法。(红黑树本身在数据量大时,层数很多,查询次数也多。这是平衡二叉树的一种,我的数据结构博客中有平衡二叉树的调节办法和相关代码)。
- B-Tree:比起红黑树超多层数有一定优化。MySQL底层使用B树变种B+树。(二叉树有两个儿子,B树有一堆儿子,通过控制儿子个数来控制层数。B+树比起B树,它的非叶子节点不存数据只存索引做冗余,所有数据都存放在叶子节点,叶子节点之间用指针链接,这个指针链接可以方便的进行范围查找)。
- HASH:哈希索引,查询单条数据非常快,但是对范围查找无能为力,所以一般不用。
B树的非叶子节点存数据,占地大;B+树非叶子节点只存索引,占地小;所以采用B+树,方便将索引放入内存。如果用B树的话因为附带有数据,放入内存并不方便。
例:MySQL使用B+树,给一个非叶子大节点分配1KB空间,这样一个非叶子的大节点可以存一千多个元素 ,树一共有三层的话,叶子节点就可以存一千多万条数据。
为什么用B+树而不用红黑树?需要再找一篇详细讲解的博客学习。
相关存储引擎
- MyISAM存储引擎:MyISAM引擎下,一张表有存放结构的文件,有存放数据的文件,有存放索引的文件共3个。MyISAM引擎查询时,先看是不是有索引,再按索引文件中的B+树结构找到需要的记录的地址,最后从数据文件中找到需要的记录。
- InnoDB存储引擎:此引擎有2个文件,存放表结构的文件和存放数据与索引的文件。这个与MyISAM的区别在于,它的记录直接就在B+树的叶子节点上接着,而MyISAM在另一个文件中。
PS:聚集索引(聚簇索引),数据和索引在一个文件就是聚集索引,不在一个文件就不是聚集索引。
PS:为什么InnoDB必须有主键,且推荐整型自增?InnoDB的数据文件中对于数据的组织方式就是B+树结构,没有主键就无法组织数据;B+树索引要多次比较大小,整型比较大小最容易;B+树的叶子节点是按顺序排列的,而且节点大小有限制,如果不自增,会导致有可能在满数据的节点插入新数据,要做很多调整,平衡,插入的开销很大。
PS:联合索引,原来一个B+树节点中单个元素只是一个索引字段,建立联合索引之后B+树节点中单个元素是好几个字段。元素按照字段顺序比较大小 ,第一个字段相同的比较第二个字段,第二个字段相同的比较第三个字段,最终确定单个元素的大小。