1 查询过程
- 对于唯一索引,查找到第一个满足条件的记录后,就会停止继续检索
- 对于普通索引,查找到满足条件的第一个记录后,需要继续查找下一个记录,直到不满足条件为止,大概率是在一个索引页(读取到内存)中进行,很快
结论:在查询的过程中,普通索引跟唯一索引的差别不大,都很快
2 更新过程
更新过程中唯一索引跟普通索引的区别
- 对于唯一索引,无论索引页(对于主键而言是数据页)是否已经读取到内存,都不会用到
change buffer,原因是需要在内存中进行唯一性判断,如果目标页不在内容中会先将目标页读取到内存 - 对于普通索引,如果索引页在内存中不存在,则会直接更新记录到
change buffer,随之更新结束,之后会将change buffer中的记录merge到索引页
结论:由于唯一索引用不上 change buffer 的优化机制,因此如果业务可以接受,从性能角度出发优先考虑非唯一索引
change buffer
- 对于普通索引,如果更新时内存中不存在要更新索引页,InnoDB 会将这些更新操作缓存在
change buffer中,这样就不需要从磁盘中读入这个数据页了 - 将
change buffer中的操作应用到原数据页,得到最新结果的过程称为merge,以下情况会merge:
- 访问这个索引页时
- 后台线程会定期 merge
- 数据库正常关闭(shutdown)的过程中
- change buffer 可以节省随机读磁盘的 IO 消耗
3 总结
在业务允许不适用数据库进行唯一性判断的时候,选用普通索引有助于提高写入效率