MySQL高级 知识拓展
数据量 和 B+Tree 的关系
事务隔离级别底层原理 MVCC
唯一索引和普通索引的关键不同点
两者区别
从查询角度来说:
- 普通索引查到符合条件的项后还有继续查找下一项,如果下一项不符合条件才返回
- 唯一索引则时查到符合条件的项后就直接返回
从更新角度来说:
- 先介绍一下 change buffer
- 它是用来记录更新操作的一种行为,在没有把数据项从硬盘读取到内存中时,进行更新操作会先将操作记录到 change buffer 中;
- 在下一次进行查询操作时再把数据项读取到内存中,此时才对数据项执行 change buffer 中的命令,这个过程也称之为 merge。
- 普通索引更新时往往将操作记录到 change buffer 中,在以下进行查询操作时在执行这些更新操作,这样可以减少磁盘与内存的 IO,而从提高效率
- 唯一索引更新时会首先判断操作的项是否在数据库表中,往往这个时候就会把数据从磁盘读取到内存,所以唯一索引是不适用 change buffer 的
如何选择
大的结论是如果业务能够保证唯一性应该尽量选择普通索引而不是唯一索引。当然如果是那种更新完了就要立马查询的,这种是不推荐使用普通索引的,因为会频繁的产生 merge 操作,change buffer 也需要额外空间来维护的,这样反而误用了 change buffer。
MRR
MRR,全称 Multi-Range Read Optimization,多范围读优化。简单的说,就是 MRR 通过把 随机磁盘读,转换为 顺序磁盘读,从而提高索引查询的性能。
为什么要把随机读转换为顺序读?它们之间是怎么转换的?为什么顺序读能提升性能?带着这素质三问去学习~
总的来说,顺序读带来了几个好处:
- 磁盘和磁头不再需要来回做机械运动;
- 可以充分利用磁盘预读;
- 在一次查询中,每一页的数据只会从磁盘读取一次;
索引本身就是为了减少磁盘 IO,加快查询,而 MRR,则是把索引减少磁盘 IO 的作用,进一步放大。