问题引申
问题1:假设有个数据库字段保存的是用户的身份证号码(id_no),那么我们在针对id_no创建索引的时候是创建唯一索引还是创建普通索引?
首先来说因为一般来讲身份证号具有唯一性,为了保证数据的唯一性,我们应该将id_no设置为唯一索引;
问题2:如果不考虑业务的唯一性呢?
如果不考虑业务唯一性问题,那么就考虑操作效率问题了,这个问题其实需要分开来说
读的情况
在读的情况下,唯一索引一般情况下是比普通索引要快的,因为查询时, 在未使用limit 1的情况下, 在匹配到一条数据后, 唯一索引即返回, 普通索引会继续匹配下一条数据, 发现不匹配后返回。如此看来唯一索引少了一次匹配, 但实际上这个消耗微乎其微.。所以可以得出结论,唯一索引在读的情况下是略快于普通索引,但是并不明显;
写的情况
首先很明确的答案是在写的情况下普通索引反而是比唯一索引要快的。为什么呢?因为普通索引将记录放到change buffer中语句就执行完毕了。而对唯一索引而言, 它必须要校验唯一性, 因此, 必须将数据页读入内存确定没有冲突, 然后才能继续操作。对于写多读少的情况, 普通索引利用change buffer有效减少了对磁盘的访问次数, 因此普通索引性能要高于唯一索引。
总结
如果考虑到业务上的唯一性保障,那么我们一般选择唯一索引,这是保障数据唯一性的最后一道屏障;如果不考虑业务的唯一性,单纯的从读写效率来说,在写比较多的情况下,我们选择唯一索引更合适。