前言
本篇文章从数据结构,B+Tree的构建过程,MySQL索引实现,索引为什么那么快,MySQL有哪些索引,聚集索引和二级索引的区别,索引失效的原因,EXPLAIN关键字分析,索引实战,索引的优缺点,什么时候应该加索引,全方面帮助读者理解MySQL索引。
一、提出问题
- MySQL索引有哪些实现方式
- 什么是B+Tree索引,B+Tree索引的构建过程,跟二叉树、红黑树的对比
- 为什么数据库存储用B+tree索引,局部性原理是什么,为什么推荐自增id
- MySQL有哪些索引,聚集索引,二级索引,覆盖索引区别,回表是什么
- 怎么加索引,索引的使用场景有哪些,加索引一定好吗
- 索引失效的场景,引发什么后果
- EXPLAIN关键字查看MySQL是否使用索引
- 慢查询优化
接下来会循序渐进,让读者完全搞懂索引是什么
二、MySQL索引有哪些实现方式
MySQL索引实现方式有:B+tree索引、Hash索引、Full-text索引。
我们最常用的是B+tree索引,主键索引(也叫聚簇索引)本身就是一个B+tree索引树,非叶子节点存储主键id,叶子节点为一整行数据,叶子节点之间通过双向链表连接支持范围扫描,一般加的唯一索引,普通索引都是B+tree索引。
Hash索引只能在memory存储引擎下使用,这里不过多描述,优点是查询快,hash取模O(1)检索,缺点不支持范围查询,出现hash冲突性能会降低。
Full-text索引主要对varchar,text加索引,使用倒排索引的方式,与搜索引擎实现方式相似。
三、为什么使用B+tree索引
先说结论,主要因为磁盘读写速度远远低于内存速度,传统的机械硬盘大概慢一万倍,固态硬盘慢100倍,故减少磁盘I/O次数是提升索引性能的重点。
根据局部性原理和磁盘预读,Linux操作系统进行磁盘I/O时,一般顺序读写4KB到内存的Page Cache中,之后再在内存中找到对应的数据返回回去,Mysql的B+tree每个节点为16KB,我们可以把16kb当作磁盘IO的最小单元。
局部性原理表现为:时间局部性和空间局部性。时间局部性是指如果程序中的某条指令一旦执行,则不