普通索引和唯一索引的选择?
程序设计中不存在银弹。
在业务逻辑中能保证唯一的前提下,到底是使用普通索引,还是使用唯一索引,取决于性能。性能由分为查询性能和更新性能。
查询性能
使用普通索引会比唯一索引扫描的行数多,使用唯一索引只需要扫描到了数据就会停止扫描,但是普通索引会继续扫描,直到不满足条件。
但是因为InnoDB引擎存储数据是以数据页为单位,所以读取数据到内存时,也是将一页数据读取。那么进行查询的时候,使用唯一索引和普通索引的性能差距可以忽略不计。
更新性能
首先要明确一个概念,change buffer是buffer pool的一部分,对于更新操作,InnoDB会将更新的数据先存到change buffer缓存区,等到查询到具体语句的时候再配合change buffer进行数据统一,或者MYSQL正常关闭的时候,会将change buffer缓存区的内容刷到mysql中。
上面是使用普通索引的情况,对于使用唯一索引,则不会利用change buffer。
因为唯一索引,更新或者插入数据需要判断数据是否唯一,所以必须从磁盘中读取数据到内存中,然后再进行操作。
所以在更新性能方面来看,使用普通索引可以利用change buffer减少与读磁盘的IO操作从而提升性能。
场景分析
普通索引替代唯一索引的场景必须满足一个条件,在业务逻辑中可以保证数据的唯一性,否则一定要使用唯一索引。
并且对于更新完了之后,会立马去读取数据的场景,使用唯一索引更好。
普通索引的场景是,对于一些归档数据,就是线上只能保存半年的数据,然后老数据保存到一个数据库里面,这些数据是已经保证了唯一性的,就可以使用普通索引来提升插入性能。