探讨mysql的普通索引和唯一索引
2021-03-23 本文已影响0人
温岭夹糕
前言
mysql的唯一索引和普通索引有什么区别,从B+树的查找来讲普通索引比唯一索引多回了一次表(因为唯一索引已经缺点了索引的唯一性,找到了就停止查找,普通索引还需往下确认),但其性能差距是微乎其微的。同时我们也在前文mysql语句的执行流程中提到过change buffer,
innodb按数据页将记录从磁盘读取到内存,默认16KB,当要执行写操作且要操作的数据刚好没有在内存中(占用buffer pool)时,就会将该操作缓存在change buffer这个缓冲区中,等下一次查询再做merge操作。
change buffer实际是可持久化数据,内存中会记录磁盘也会写入
change buffer能减少IO的读写,提高内存的利用率,但是并不是所有情况都会用到change buffer--索引的唯一性就是条件。
将数据从磁盘读入内存涉及到随机IO访问是数据库成本最高的操作之一,change buffer正是因此能提升很大的性能
唯一索引的写操作
对于唯一索引来说,要进行插值操作(k=4),就要判断k=4这个索引是否已经存在,而这必须要将数据读入内存才能判断,都已经读入内存了,那直接更新内存会更快,就用不到change buffer了!因此唯一索引的写操作不能使用change buffer。
当使用change buffer时,merge操作才是真正的更新数据,所以当一个数据页做merge更新时,change buffer记录越多收益越大,即写多读少的业务。那写少读多呢?一条数据在写入后立即要进行读取,即使立即触发merge,随机访问IO的次数也不会减少,反而增加了chang buffer的维护代价,反而起了反作用。当然所有优化的前提是确保业务的正确性