MySQL概述
基础篇
通用语法及分类
DCL
DQL
DML
DDL
函数
字符串函数
数值函数
日期函数
流程函数
约束
常用约束
外键约束
多表查询
多表关系
查询
内连接查询
外连接查询
自连接查询
联合查询
子查询
事务
进阶篇
存储引擎
性能分析
查看执行频次
慢查询日志
profile
explain
索引
索引结构
索引分类
语法
使用规则
设计原则
SQL 优化
插入数据
主键优化
order by优化
group by优化
limit优化
count优化
update优化(避免行锁升级为表锁)
视图
存储过程
触发器
锁
InnoDB 引擎
事务原理
MVCC
数据类型
权限一览表
图形化界面工具
索引结构 - MySql学习文档 - 笔下光年
网站首页
索引结构
| 索引结构 | 描述 | | ------------ | ------------ | | B+Tree | 最常见的索引类型,大部分引擎都支持B+树索引 | | Hash | 底层数据结构是用哈希表实现,只有精确匹配索引列的查询才有效,不支持范围查询 | | R-Tree(空间索引) | 空间索引是 MyISAM 引擎的一个特殊索引类型,主要用于地理空间数据类型,通常使用较少 | | Full-Text(全文索引) | 是一种通过建立倒排索引,快速匹配文档的方式,类似于 Lucene, Solr, ES | | 索引 | InnoDB | MyISAM | Memory | | ------------ | ------------ | ------------ | ------------ | | B+Tree索引 | 支持 | 支持 | 支持 | | Hash索引 | 不支持 | 不支持 | 支持 | | R-Tree索引 | 不支持 | 支持 | 不支持 | | Full-text | 5.6版本后支持 | 支持 | 不支持 | #### B-Tree ![二叉树](https://dhc.pythonanywhere.com/media/editor/二叉树_20220316153214227108.png "二叉树") 二叉树形成链表的缺点可以用红黑树来解决: ![红黑树](https://dhc.pythonanywhere.com/media/editor/红黑树_20220316163142686602.png "红黑树") 红黑树也存在大数据量情况下,层级较深,检索速度慢的问题。 为了解决上述问题,可以使用 B-Tree 结构。 B-Tree (多路平衡查找树) 以一棵最大度数(max-degree,指一个节点的子节点个数)为5(5阶)的 b-tree 为例(每个节点最多存储4个key,5个指针) ![B-Tree结构](https://dhc.pythonanywhere.com/media/editor/B-Tree结构_20220316163813441163.png "B-Tree结构") > B-Tree 的数据插入过程动画参照:https://www.bilibili.com/video/BV1Kr4y1i7ru?p=68 演示地址:https://www.cs.usfca.edu/~galles/visualization/BTree.html #### B+Tree 结构图: ![B+Tree结构图](https://dhc.pythonanywhere.com/media/editor/B+Tree结构图_20220316170700591277.png "B+Tree结构图") > 演示地址:https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html 与 B-Tree 的区别: - 所有的数据都会出现在叶子节点 - 叶子节点形成一个单向链表 MySQL 索引数据结构对经典的 B+Tree 进行了优化。在原 B+Tree 的基础上,增加一个指向相邻叶子节点的链表指针,就形成了带有顺序指针的 B+Tree,提高区间访问的性能。 ![MySQL B+Tree 结构图](https://dhc.pythonanywhere.com/media/editor/结构图_20220316171730865611.png "MySQL B+Tree 结构图") #### Hash 哈希索引就是采用一定的hash算法,将键值换算成新的hash值,映射到对应的槽位上,然后存储在hash表中。 如果两个(或多个)键值,映射到一个相同的槽位上,他们就产生了hash冲突(也称为hash碰撞),可以通过链表来解决。 ![Hash索引原理图](https://dhc.pythonanywhere.com/media/editor/Hash索引原理图_20220317143226150679.png "Hash索引原理图") 特点: - Hash索引只能用于对等比较(=、in),不支持范围查询(betwwn、>、<、...) - 无法利用索引完成排序操作 - 查询效率高,通常只需要一次检索就可以了,效率通常要高于 B+Tree 索引 存储引擎支持: - Memory - InnoDB: 具有自适应hash功能,hash索引是存储引擎根据 B+Tree 索引在指定条件下自动构建的 #### 面试题 1. 为什么 InnoDB 存储引擎选择使用 B+Tree 索引结构? - 相对于二叉树,层级更少,搜索效率高 - 对于 B-Tree,无论是叶子节点还是非叶子节点,都会保存数据,这样导致一页中存储的键值减少,指针也跟着减少,要同样保存大量数据,只能增加树的高度,导致性能降低 - 相对于 Hash 索引,B+Tree 支持范围匹配及排序操作
上一篇:
索引
下一篇:
索引分类