索引是帮助MySQL高效获取数据的排好序的数据结构
Hash表
二叉树
红黑树
B-Tree(B树)
-------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------
二叉树
平衡二叉树
但随着数据量的增多,平衡二叉树树的高度会越来越高,大概1000条数据就有9 - 10层,那也就是说可能找一个数据需要9 -10次 IO。
那假如1万条,百万条数据呢?
那有没有方法解决高度过高的情况呢?
那肯定是必须的呀,所以有B-Tree以及B+Tree,尽可能往节点中塞进更多的数据,当然不是越多越好。
-------------------------------------------------------------------------------------------
为了解决高度过高的问题,在节点中放入m个孩子,从而减少树的高度,减少磁盘IO.
B-Tree(B树)
多路搜索树,每个节点有多个孩子。
B+Tree(B+树) B树的升级版
B-Tree与B+Tree比对:
✖不同点:
✔相同点:
看完这两个比对,就知道为什么MySQL选择B+Tree。
其中B+Tree的优化就是能更大程度的降低树的高度,非叶子不存数据,让节点尽可能在有限的空间中塞进更多的孩子。
也包括其叶子节点是一个有序的双向链表,在区间搜索有一定的优势。
-------------------------------------------------------------------------------------------
为什么 B+tree 不在非叶子结点存储除索引外的其他数据呢?
答: 为了继续降低树的高度,同时让非叶子结点可以存储更多的索引。
一个节点有其固定的容量大小,如果在相同的容量下,可以存储更多的索引,那么树的高度就会下降,遍历次数变小,搜索将会变快。
-------------------------------------------------------------------------------------------
我们常听到什么聚集索引
,非聚集索引
,其实区分他们仅需要知道他们的底层数据存储的索引文件
和数据文件
是不是分开的。
索引和数据都存储在一个地方,他就是聚集索引
索引和数据不存储在同一个地方,他就是非聚集索引
InnoDB
存储引擎两个文件分别存储:
MyISAM
存储引擎三个文件分别存储:
MyISAM 存储引擎底层使用的是 B+tree,叶子结点只存储了所有的索引 + 数据的磁盘地址。
因此索引文件和数据文件是分离的,它是非聚集索引
- 数据文件本身就是按B+Tree组织的一个索引结构文件
- 聚集索引的叶子节点包含了完整的数据记录
-------------------------------------------------------------------------------------------
自增整型排序效率高,使用整形自增主键情况下,数据只需要一直往叶子结点后面放即可,大大减少索引页的分裂和移动数据产生的磁盘开销。
-------------------------------------------------------------------------------------------
都看到这里了,能给赞吗,谢谢!