MySQL底层数据结构与算法
一、索引数据结构
1、什么是索引
索引就是一种数据结构(排好序的数据结构
),能帮助我们高效的获取数据,例如目录
慢查询:在数据库当中执行时间较长的SQL语句,也称之为慢SQL
创建索引的目的:为了减少磁盘I/O的次数,加快查询效率
2、索引数据结构
具备充当索引的数据结构有以下几种:二叉树、红黑树、hash表、B树(B+树)。
而我们数据库最终使用的是B+树(B+树的改进,叶子节点间添加了双向指针,便于范围查找)。
数据结构可视化网站:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
- 二叉树
二叉树对于单边增长就是链表
二叉树特点是每个节点最多只能有两棵子树,且有左右之分。如果是顺序的插入数据,二叉树会退化成链表,那么查找其中的元素的时候,就会需要整体的遍历,显然不适合作为数据库的索引。
- 红黑树(二叉平衡)
HashMap 早期的表现形式为动态数组加链表,现在为红黑树
缺点:树的查找都是由跟节点往下查找,高度不可控制
性能影响查找的次数与高度相关
红黑树是一种平衡的二叉树。添加节点的时候,相比二叉树,节点间会进行自动的平衡,不会退化成链表,可以有效降低树的高度。但是红黑树本质还是二叉树,对于数据库来说,避免不了在数据量大的情况下,树的高度依然非常高的情况。
-
Hash
对索引的key进行一次Hash计算就可以定位出数据存储的位置,查找效率非常高。
但是Mysql数据库不使用Hash表进行索引存储,原因:
- Hash表只能满足精确查找 “=”,不支持大于,小于等范围查询,范围查询需要全表扫描
- 存在Hash冲突问题
-
B-Tree
B树是一棵平衡的m路搜索树,它的子节点可以有多个,使得整颗树更加的扁平化。所有节点关键字是按递增次序排列,并遵循左小右大原则。B树(B+树)一般较多用在存储系统上,比如数据库或文件系统。
-
B+Tree
B+树是B树的一个升级版,相对于B树来说B+树更充分的利用了节点的空间,让查询速度更加稳定,其速度完全接近于二分法查找。
1、B+树的非叶子节点不保存关键字记录的指针,只进行数据索引,这样使得B+树每个非叶子节点所能保存 的关键字大大增加
2、B+树叶子节点的关键字从小到大有序排列,左边结尾数据都会保存右边节点开始数据的指针,方便范围查 找
问题
MySQL为什么选择B+Tree而不选择B-Tree
1、B+Tree的中间节点只用来索引,所以对于相同的空间B+Tree里面存储的关键字更多,B+Tree相对就更加矮 胖一些,所以磁盘IO的次数就少一些。
2、由于B-Tree的中间节点也存储数据,所以它的查询效率不是很稳定,最好的情况是在根节点就直接查询到数据了,而最差的情况是下叶子节点才能找到数据。而B+Tree不管什么时候都必须要到叶子节点才能获得数据,这是因为B+Tree里面非叶子节点不存储数据只是用来索引。
- 由于B-Tree的中间节点也存储数据,所以它的查询效率不是很稳定,最好的情况是在根节点就直接查询到数据了,而最差的情况是下叶子节点才能找到数据。而B+Tree不管什么时候都必须要到叶子节点才能获得数据,这是因为B+Tree里面非叶子节点不存储数据只是用来索引。
3、MySQL存储引擎
存储引擎对于数据库表级别生效
InnoDB与MyISAM(MyISAM存储方式里面,索引和数据是分开存储的)
InnoDB VS MyISAM
- InnoDB:聚簇索引(索引组织表中数据也是索引的一部分)
- MyISAM:非聚簇索引(索引文件和数据文件是分离的,查找数据需要进行回表)
- 文件结构:frm格式文件同为表结构,但是MyISAM有MYD(数据)、MYI(索引)分别存储,InnoDB只有ibd文件存储索引和数据
- 联合索引:联合索引会根据字段定义的顺序排序,所以使用联合索引也需要严格遵循字段定义的顺序
有MYD(数据)、MYI(索引)分别存储,InnoDB只有ibd文件存储索引和数据
- 联合索引:联合索引会根据字段定义的顺序排序,所以使用联合索引也需要严格遵循字段定义的顺序