普通缩影和唯一索引
普通索引和唯一索引都是二级索引。区别是唯一索引由数据库保证字段的唯一性。
查询过程中,普通索引和唯一索引的性能差不多,普通索引也就是多判断一次而已。
更新过程,普通索引可以使用change buffer优化,唯一索引因为要检查数据的唯一性,必须要将数据读入内存,可能引入磁盘的随机读,性能会下降。
使用普通索引,数据的唯一性要靠业务来保证。
change buffer机制
change buffer 就是一个内存缓存,在更新或者插入数据的时候,如果数据也不在内存中,则先将数据写入change buffer,等以后读数据的时候,将数据也读到内存再进行merge。
在写入操作很频繁的时候,由于无法使用change buffer机制,唯一索引可能成为性能瓶颈。可以通过查看缓存命中率来判断。
但是对于写完立即就读的业务来说,change buffer没什么用途,还增加了维护负担。这时候可以考虑关闭change buffer。
注意区分change buffer 和redo log。redo log 是防止内存中的数据丢失的,change buffer就是那个内存中的数据(之一)。
优化器索引选择
选错索引是MySQL优化器的策略问题。
扫描行数是优化器判断使用哪个索引的指标之一。优化器根据统计量“区分度”来估算扫描函数,但是“区分度”是采样统计的,随着数据的变化,可能变得不准确。但是优化器有纠正机制,就是在更新行数超过1/M的时候重新统计。
扫描函数的统计错误还可能出现在大量的删除或者插入执行事务中,因为为