MySQL实战第一篇

154 阅读2分钟

普通索引和唯一索引 普通索引和唯一索引的选择:

对于查询操作来说,普通索引,查询到满足条件的一个记录之后,继续查找下一个记录,直到查询到不满足条件的记录。唯一索引,由于索引唯一性,查询到第一个满足的记录后,停止检索。但是两者的性能差距微乎其微,因为innoDB是根据数据页来读写的

对于更新操作来说,当需要更新一个数据页,如果数据页在内存中就直接更新,如果不在内存中,在不影响数据一致性的前提下,InnoDB会将这些更新操作缓存在change buffer中。下次查询需要访问这个数据页的时候,将数据页读入内存,然后执行change buffer中的与这个页有关的操作。

什么是change buffer?当数据进行更新操作的时候,innoDB把这些操作缓存到change buffer中,实际上它是可以持久化的数据,也就是说change buffer在内存中有拷贝,也会被写入到磁盘上。

将change buffer中的操作应用到原数据页,得到最新结果的过程叫merge。出了访问这个数据页会出发merge外,系统有后台线程会定期merge。在数据库正常关闭的过程中,也会执行merge操作。

change buffer的使用条件?

对于唯一索引来说,所有的更新操作都必须判断唯一性,判断唯一性的话只能通过读入内存来判断,既然都已经读到内存了,那直接更新就会更快,没必要用change buffer,只有索引为普通索引才使用change buffer

change buffer的使用场景?

因为merge的时候是真正进行数据更新的时刻,而change buffer的主要目的就是将记录的变更动作缓存下来,所以来说在一个数据页进行merge之前,change buffer记录的变更越多越好,当对于写多读少的业务来说,使用change buffer的效果最好,例如账单类、日志类的系统

唯一索引和普通索引的选择?

这两类索引才查询方面的能力几乎是没有差别的,主要是考虑对更新性能的影响,索引尽量使用普通索引。但是如果在更新某个记录之后,立马伴随着查询操作的话,建议是关闭change buffer

change buffer和redo log?

redo log主要节省的是随机写磁盘的IO消耗(转成顺序写),而change buffer主要节省的则是随机读磁盘的IO消耗。