声明:本文章内容是根据极客时间中林晓斌的课程《MYSQL45讲》,经过学习,加以自己的理解形成的笔记。具体原文可以到官网进行阅读。如有侵权请,告知删除。
普通索引和唯一索引的本质上的区别就是索引的重复与否。主键也是一种唯一索引,那么就用下面的图片举例说明
上述图片中ID是唯一索引;k是普通索引
1.查询过程
- 对于普通索引,当查询到记录之后,需要查询下一个记录,知道碰到第一个不满足条件的记录
- 对于唯一索引来说,由于唯一性,查询到数据之后可以直接返回,不用再继续搜索
2.更新过程
2.1change buffer
当需要更新一个数据页时,如果数据页在内存中就直接更新,而如果这个数据页没有在内存中的话,在不影响数据一致性的前提下,InnoDB会将这些更新操作缓存 在change buffer中。只需要等下次访问这个数据页的时候,将数据读入内存,然后执行change buffer中的这个操作。
将 change buffer 中的操作应用到原数据页,得到最新结果的过程称为 merge。除了访问这个数据页会触发 merge 外,系统有后台线程会定期 merge。在数据库正常关闭(shutdown)的过程中,也会执行 merge 操作。
如果要在这张表中插入一个新记录 (4,400) 的话,InnoDB 的处理流程是怎样的。
1.这个记录要更新的目标页在内存中
- 对于唯一索引来说,找到 3 和 5 之间的位置,判断到没有冲突,插入这个值,语句执行结束;
- 对于普通索引来说,找到3和5之间的位置,插入这个值,语句执行结束
2.这个记录要更新的目标页不在内存中
- 对于唯一索引来说,需要将数据页读入内存,判断没有冲突值,然后进行插入与否
- 对于普通索引来说,直接记录在chanage buffer当中
因为在插入过程中 普通索引减少随机读磁盘,所以性能会更好,这得益于 change buffer
3.change buffer 和 redo log
redo log 主要节省的是随机写磁盘的 IO 消耗(转成顺序写),而 change buffer 主要节省的则是随机读磁盘的 IO 消耗。
啥是随机写?为啥那么耗性能?
随机写我的理解是,这次写磁盘的那个扇区和上一次没啥关系,需要重新定位位置,机械运动是很慢的即使不是机械运动重新定位写磁盘的位置也是很耗时的。