发表于: 2020-08-20 23:34:38

1 1228


今天完成的事情

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 消耗。



返回列表 返回列表
评论

    分享到