MYSQL普通索引和唯一索引的区别和特点

创建

普通索引:
ALTER TABLE 库名.表名 ADD INDEX 索引名(列名);

唯一索引:
ALTER TABLE 库名.表名 ADD UNIQUE INDEX 索引名(列名);

接下来对比一下普通索引和唯一索引在查找和更新时的区别。
对比之前需要先知道Innodb的数据不是需要一条记录只读取一条,而是按照数据页进行读取的,只有知道了这个机制,才能了解两种索引对比的区别。

还需要了解一个概念,就是change buffer。change buffer简单来说用于随机读数据时性能的提升,在insert、update、delete时,针对普通索引的一种优化手段。

查找

普通索引:
匹配到第一条数据,并不会停止检查,会继续向后扫描数据,直到发现第一条不匹配的数据才停止,因为普通索引不保证数据的唯一性。
对于普通索引,如果要查找的某条数据刚好在数据页最后一个位置,那么就需要额外再读取一次,拿到下一个数据页,判断第一条数据是否符合条件。

唯一索引:
因为数据的唯一性,匹配到第一条数据即停止匹配。

更新

普通索引:
如果要更新的数据在内存中,直接更新;如果要更新的数据不在内存中,则将更新记录更新在change buffer中。

唯一索引:
更新操作都需要判断是否违反唯一约束条件,当插入或更新时,要判断是否唯一,那么就需要读取数据页到内存,既然数据已经读取到内存,就不需要使用change buffer了。

总结:
只有普通索引才能使用change buffer,唯一索引因为要判断数据的唯一性,需要将数据页读入内存,则没有必要使用change buffer,也就是不能使用change buffer。
在业务开发中,没有特殊要求,建议使用普通索引,如果需要