先说结论:

对查询:普通索引和唯一索引对查询性能影响很小

对更新:唯一索引比普通索引更耗时.

 

查询流程:唯一索引找到第一个匹配数据后不继续往后查找.

1.普通索引,从索引树根节点开始按层往下查找,找到对应的数据页,然后二分法查找节点,找到第一个匹配的数据后,继续往后查找,直到不满足条件.然后返回.

2.唯一索引,从索引树根节点开始按层往下查找,找到对应的数据页,然后二分法查找节点,找到第一个匹配的数据后,直接返回.

 

更新流程:唯一索引对更新需要判断是否冲突

1.普通索引,找到对应的数据页,如果在内存中,直接更新,如果不在内存中,更新到change buffer中

2.唯一索引,找到对应的数据页,如果在内存中,直接更新,如果不在内存中,读取数据页,更新内存.

 

知识点:change buffer

1.当需要更新一个数据页时,如果数据页在内存中就直接更新,否则缓存到change buffer中,在下次查询需要访问这个数据页的时候,将数据页读入内存,然后把change buffer 应用到这个数据页中.这个过程称为merge.

2.除了访问这个数据页会触发 merge 外,系统有后台线程会定期 merge。在数据库正常关闭(shutdown)的过程中,也会执行 merge 操作。

显然,如果能够将更新操作先记录在 change buffer,减少读磁盘,语句的执行速度会得到明显的提升。而且,数据读入内存是需要占用 buffer pool 的,所以这种方式还能够避免占用内存,提高内存利用率。

3.change buffer 用的是 buffer pool 里的内存,因此不能无限增大。change buffer 的大小,可以通过参数 innodb_change_buffer_max_size 来动态设置。这个参数设置为 50 的时候,表示 change buffer 的大小最多只能占用 buffer pool 的 50%。