MySQL索引失效问题
索引结构
不同引擎有不同的索引结构。
索引结构 | 描述 |
---|---|
B+Tree索引 | 最常见的索引类型,大部分引擎都支持B+Tree索引 |
Hash索引 | 底层数据结构是用哈希表实现的,只有精确匹配索引列的查询才有效,不支持范围查询 |
R+Tree(空间索引) | 空间索引是MyISAM引擎的一个特殊索引类型,主要用于地理空间数据类型,通常使用较少 |
Full-text(全文索引) | 是一种通过建立倒排索引,快速匹配文档的方式。类似于Lucene,Solr,ES |
- 二叉树
二叉树缺点:顺序插入时,会形成一个链表,查询性能大大降低。大数据量情况下,层级较深,检索速度慢。
红黑树:大数据量情况下,层级较深,检索速度慢。
解决层级深出现了B-Tree
- B-Tree(多路平衡查找树)
以一颗最大度数(max-degree)为5(5阶)的b-tree为例(每个节点最多存储4个key,5个指针):
B-Tree结构形成演示网站
B-Tree Visualization
- B+Tree结构
与B树不同,所有的节点数据,在底层的节点数据中都能找到,上面的节点只是起到索引的作用
底层节点的数据会用指针形成一个链表
所有的数据都挂载子节点上面
- MySQL对B+树结构的优化
增加了一个相邻的指针,提高区间访问速度
B+Tree结构形成演示网站
B+ Tree Visualization
- 为什么InnoDB存储引擎选择使用B+Tree索引结构?
- 相对于二叉树,层级更少,搜索效率高;
- 对于B-Tree,无论是叶子节点还是非叶子节点,都会保存数据,这样导致一页中存储的键值减少,指针跟着减少,要同样保存大量数据,只能增加树的高度,导致性能降低。