两个具有相同列的重复索引

时间:2013-12-06 22:51:09

标签: mysql sql indexing

我正在查看数据库中的一个表(我没有制作表),我看到有两个完全相同的索引(我不知道为什么这样做)只是命名不同,这会对桌子产生任何负面影响吗?

拿这个例子表:

create table mytable(
    mytable_id int unsigned primary key auto_increment,
    user_id int unsigned,
    amount decimal(12,2),
    index user_id_idx(user_id),
    index user_id_2(user_id)
);

2 个答案:

答案 0 :(得分:13)

是的,它会产生影响。

当然,如果使用它们,两个索引会在磁盘上占用额外的空间。

但是它们也会导致查询优化器在每个SELECT期间做更多的工作来计算每个索引的好处。您拥有的索引越多,它必须比较的情况就越多。因此,消除真正的冗余索引是值得的。

正如其他人也注意到的那样,索引在INSERT / UPDATE / DELETE操作期间更新,因此您拥有的索引越多,其代表的开销就越大。获得大量使用的索引证明了它们自己的开销,但重复的索引需要更多的开销而没有额外的好处来匹配。

如果您有兴趣,Percona Toolkit有一个工具pt-duplicate-key-checker,可以在您的所有表格中搜索此类案例。

答案 1 :(得分:2)

是的,它会影响性能。每次编写新行或更改user_id时,MySQL都必须写三次:一次写入表,一次写入user_id_idx索引,一次写入user_id_2索引。我摆脱了其中一个。

在删除额外索引之前,请确保它未在任何地方引用。大多数情况下,索引没有按名称提及,但有例外情况,例如index hints