假设要给一个身份证号字段加索引,应该使用什么索引呢?
身份证号比较长,所以不建议当做主键,那剩下唯一索引和普通索引怎么选择呢?
先来看查询
唯一索引查询到符合条件的数据后,就直接返回,不需要在判断其他的值。
普通索引在查询到符合条件的数据后,需要在判断下一个值是否符合条件。
当业务上保证这个字段的值都是唯一的时候,普通索引的多判断一下的操作可以忽略不计。
所以在查询上,唯一索引和普通索引效果相似。
再来看更新
唯一索引是需要找到数据,判断这个字段的值是否存在,如果这个数据页在内存中,那么直接操作内存。
如需要的数据页不在内存中,需要把这个数据页加载到内存,再判断是否冲突,不冲突则插入。
普通索引更新时,如果数据也在内存中,那么就直接操作内存,如果数据也不再内存中,只需要更新change buffer,不需要加载数据页,等数据页后续被加载到内存中后,再进行merger操作。mysql系统后台也有一个线程定期merger。
在业务能保证数据唯一的情况下,使用普通索引要好。
扩展:
对于写多读少的场景,一些数据写入不会马上读取,使用change buffer 的效果是很好的,可以起到加速作用。
而在一些写完就需要立即读的场景,最好关闭change buffer,因为即使写到change buffer,也需要立即读取,从磁盘加载数据页,进行merge,这样反而增加了维护change buffer 的操作,反而起到副作用。
redo log主要节省的是磁盘的随机读的消耗,change buffer节省的磁盘随机写的消耗。
