MySQL的索引 B+Tree
1. 常见索引的数据结构
示意图均从www.cs.usfca.edu生成
- 哈希(Hash)
- 示意图
- 效率高,但是因为Hash算法的特性,数据无序,不能进行范围搜索
- 示意图
- 二分搜索树(Binary Search Tree)
- 示意图
- 数据有序,能够按范围查找,但是容易造成部分数据倾斜,导致该部分数据查询较慢
- 示意图
- 平衡二分搜索树(Balanced Binary Search Tree, AVL Tree)
- 示意图
- 是二分搜索树的优化版,解决了数据倾斜的问题,但是需要维护树平衡的额外开销
- 示意图
- B树(B Tree)
- 示意图
- 每个节点可以存多条数据,子节点数量也可以大于2,优化了树的深度
- 示意图
- B+树(B+Tree)
- 示意图
- 叶子节点会额外存储指向相邻叶子节点的指针,优化B树范围查询效率,且更加稳定
- 示意图
2. MySQL中B+Tree的使用
- MySQL采用B+Tree,其关键点如下:
- 非叶子节点存索引,控制树的深度
- 叶子节点存数据,以及指向相邻叶子节点的指针
- 数据存入硬盘,需控制每一份数据的大小,以适应硬盘分页
- 那么每一份数据应该存多大呢?
- MySQL每一份数据是硬盘分页大小的倍数
- 系统从硬盘中进行读取操作,是按页读取的(例如1024k、2048k……)
- 如果MySQL每一份数据的大小比硬盘一页的量小,那么每次硬盘读取就可能会读取一些不需要的数据,影响性能
- 通过
SHOW GLOBAL STATUS LIKE 'Innodb_page_size';
即可查看MySQL每份数据的大小
- MySQL每一份数据是硬盘分页大小的倍数
3. MySQL中两大主要引擎的索引
- MyISAM(非聚集索引)
- 索引和数据分开存
- 主键索引(Primary Key): 直接根据索引找到值
- 辅助索引(Secondary Key): 直接根据索引找到值
- InnoDB(聚集索引)
- 索引和数据存一起(必须有一个索引,没有会建一个默认的)
- 主键索引(Primary Key): 直接根据索引找到值
- 辅助索引(Secondary Key): 先用索引找到主键,再根据主键找到值