索引的一个小知识点:冗余索引和重复索引

389 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第13天,点击查看活动详情

冗余和重复索引

MySQL是允许在相同列上创建多个索引,无论你创建的时候是有意的还是无意的。MySQL需要单独维护重复的索引,并且优化器在优化查询的时候也需要进行逐个考虑,这回影响性能。

重复索引,啥叫重复索引,就是指在相同的列上按照相同的顺序创建的相同类型的索引。应该避免这样的创建,发现之后也应该立即移除。

你比如说下面这样的例子:

create table test(
        ID int NOT null primary key,
        ......
        
        unique(ID),
        INDEX(ID)
)

这上面,你创建了一个主键,先加上唯一限制,然后再加上索引以供查询使用。事实上呀,MySQL的唯一限制和主键限制都是通过索引实现的 ,因此呀,上面这个写法其实就是在相同的列上 创建了三个重复的索引。通常情况下是没有必要这样做的,除非呀是在同一列上创建不同类型的索引来满足不同的查询需求。

冗余索引和重复索引其实又有一些不同。如果创建了索引(A,B),再创建索引(A)那就是冗余索引了,因为这只是前一个索引的前缀索引。但是你要是创建的是(B,A)那可就不是冗余索引了。当然不同的索引类型肯定也不会涉及到冗余索引的事情。

还有一种情况,将索引(A)扩展为了索引(A,ID),其中ID是主键,这在innodb中来说,主键列已经包含到二级索引中去了,所以这也是冗余索引。

大多数情况下,我们不应该是创建新索引,而是扩展已有的索引。但你话也不能说死,有时候出于性能的考虑,也会考虑冗余索引,因为你扩展索引会导致其变得太大,从而影响其他使用该索引的查询的性能。