目录
具备充当索引的数据结构有以下几种:二叉树、红黑树、hash表、B树(B+树)。
而我们数据库最终使用的是B+树(B+树的改进,叶子节点间添加了双向指针,便于范围查找)。
数据结构可视化网站:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
1、二叉树
二叉树特点是每个节点最多只能有两棵子树,且有左右之分。如果是顺序的插入数据,二叉树会退化成链表,那么查找其中的元素的时候,就会需要整体的遍历,显然不适合作为数据库的索引。
2、红黑树
红黑树是一种平衡的二叉树。添加节点的时候,相比二叉树,节点间会进行自动的平衡,不会退化成链表,可以有效降低树的高度。但是红黑树本质还是二叉树,对于数据库来说,避免不了在数据量大的情况下,树的高度依然非常高的情况。
3、hash表
Hash表,对索引的key进行一次Hash计算就可以定位出数据存储的位置,效率非常高。
但是数据库不使用Hash表进行索引存储,原因:
- Hash表只能满足精确查找 “=”,不支持大于,小于等范围查询,范围查询需要全表扫描
- 存在Hash冲突问题
4、B树(B+树)
B树是一棵平衡的m路搜索树,它的子节点可以有多个,使得整颗树更加的扁平化。所有节点关键字是按递增次序排列,并遵循左小右大原则。B树(B+树)一般较多用在存储系统上,比如数据库或文件系统。
B+树是B树的一个升级版,相对于B树来说B+树更充分的利用了节点的空间,让查询速度更加稳定,其速度完全接近于二分法查找。//冗余索引
- B+树的非叶子节点不保存关键字记录的指针,只进行数据索引,这样使得B+树每个非叶子节点所能保存的关键字大大增加。
- B+树叶子节点的关键字从小到大有序排列,左边结尾数据都会保存右边节点开始数据的指针,方便范围查找。
5、MySQL中的数据库索引
数据库查找最消耗性能的就是磁盘IO,对于数据库索引,一般把第一层数据页(或者所有非叶子节点的数据页)放在缓存中,可以有效的减少磁盘IO的数量。
Mysql中高度为3的B+树大概可以存放多少数据呢?
以索引使用整型BigInt类型为例,一个BigInt占8个字节,磁盘地址大概占用6个字节,所以一个索引页的数据表示占用大概14个字节。
Mysql中数据页大小为16K,16x1024/14=1170,因此一个数据页大概可以存1170条索引,假设我们的数据大小为1K,那么三层B+树,可以表示1170x1170x16=21902400条数据(2000万)
查看数据页情况:
show global variables like '%page%';
聚簇索引和非聚簇索引
聚簇索引:索引组织表中数据也是索引的一部分
非聚簇索引:索引文件和数据文件是分离的,查找数据需要进行回表
MyISAM和Innodb的文件存储结构
联合索引
联合索引会根据字段定义的顺序排序,所以使用联合索引也需要严格遵循字段定义的顺序。