02.10 Day 22 - 普通索引与唯一索引

大家好,我是 Snow Hide,作为《MySQL 实战》这个专栏的学员之一,这是我打卡的第 22 天,也是我第 79 次进行这种操作。

今天我温习了该专栏里一篇叫《普通索引和唯一索引,应该怎么选择?》的文章。

关键词总结:查询过程(普通索引、唯一索引)、更新过程(change buffer 使用条件、目标页在内存中的处理流程、目标页不在内存中的处理流程)、change buffer 的使用场景(适用的场景、不适用的场景)、索引选择和实践(尽量选普通索引、机械硬盘环境下)、change buffer 和 redo log(redo log 所优化的方面、change buffer 所优化的方面)。

所学总结:

查询过程

通过 B+ 树从树根开始,按层搜索到叶子节点。

普通索引

对于普通索引来说,查找到满足条件的第一个记录后,需要查找下一个记录,直到碰到第一个不满足条件的记录

唯一索引

对于唯一索引来说,由于索引定义了唯一性,查找到第一个满足条件的记录后,就会停止继续检索。
 

更新过程

change buffer 使用条件

如果都已经入读到内存了,那直接更新内存会更快,就没必要使用 change buffer 了。
因此,唯一索引的更新就不能使用 change buffer,实际上也只有普通索引可以使用。

目标页在内存中的处理流程

  • 对于唯一索引来说,找到两个值之间的位置,判断到没有冲突,插入这个值,语句执行结束;
  • 对于普通索引来说,找到两个值之间的位置,插入这个值,语句执行结束。

目标页不在内存中的处理流程

  • 对于唯一索引来说,需要将数据页读入内存,判断到没有冲突,插入这个值,语句执行结束;
  • 对于普通索引来说,则是将更新记录在 change buffer,语句执行就结束了。
     

change buffer 的使用场景

change buffer 只限于用在普通索引的场景下,而不适用于唯一索引。

适用的场景

对于写多读少的业务来说,页面在写完以后马上被访问到的概率比较小,此时 change buffer 的使用效果最好。这种业务模型常见的就是账单类、日志类系统。

不适用的场景

假设一个业务的更新模式是写入之后马上查询,那即使满足了条件,将更新先记录在 change buffer,但之后由于马上访问数据页,会立即触发 merge 过程。这样随机访问 IO 的次数不会减少,反而增加了 change buffer 的维护代价。
 

索引选择和实践

尽量选普通索引

普通索引和 change buffer 的配合使用,对于数据量大的表的更新优化还是很明显的。

机械硬盘环境下

在使用机械硬盘时,change buffer 这个机制的收效是非常显著的。
 

change buffer 和 redo log

redo log 所优化的方面

主要节省的是随机写磁盘的 IO 消耗(转成顺序写)。

change buffer 所优化的方面

主要节省的是随机读磁盘的 IO 消耗。

末了

重新总结了一下文中提到的内容:普通索引和唯一索引的选择、数据的查询和更新过程、change buffer 的机制以及应用场景、索引选择的实践。

发布了139 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/stevenchen1989/article/details/104243512