发表于: 2020-08-20 23:34:38
1 1218
今天完成的事情
1. 唯一索引与普通索引在性能上的区别
收获
1. 从性能的角度上应该选择普通索引
从四种情景中分析
查询过程:
普通索引在查询的时候,查询到第一个满足条件的记录之后需要查找下一个记录,直到碰到第一个不满足条件的记录。
唯一索引来说,由于索引定义了唯一性,查找到第一个满足条件的记录后,就会停止继续检索。
由于在 InnoDB 中数据是按照数据页为单位来获取的,每一页大小为 16KB ,所以两种查询方式的区别很小。
更新过程:
在更新数据的时候如果数据页在内存中就直接更新,而如果这个数据页还没有在内存中的话,在不影响数据一致性的前提下,InnoDB 会将这些更新操作缓存在 change buffer 中,这样就不需要从磁盘中读入这个数据页了。
对于唯一索引来说是用不到 change buffer 的,因为插入之前需要判断数据的唯一性,把所有的数据读入到内存中。
普通索引的更新数据是可能直接写入 change bugffer 的。
更新过程分为两种情况:
a,需要更新的数据所在目标页在内存中
对于唯一索引来说,判断到没有冲突,插入这个值,语句执行结束;
对于普通索引来说,找到 3 和 5 之间的位置,插入这个值,语句执行结束。
但是这个差别也非常小,因为现在的 cpu 非常快,判断唯一索引并不会很费时间。
b,需要更新的目标页不在内存中
对于唯一索引来说,需要将数据页读入内存,判断到没有冲突,插入这个值,语句执行结束;
对于普通索引来说,则是将更新记录在 change buffer,语句执行就结束了。
由于 change buffer 减少了磁盘访问,所以对性能的提升非常明显。
2. InnoDB 的 redo log 与 change buffer 的区别
数据库可以直接在 change buffer 中获取数据并且返回, redo log 用于记录插入这一动作,需要的时候再把数据写入磁盘。
redo log 的目的是节省随机写磁盘的消耗,而 change buffer 主要节省的则是随机读磁盘的 IO 消耗。
评论