我正在查看数据库中的一个表(我没有制作表),我看到有两个完全相同的索引(我不知道为什么这样做)只是命名不同,这会对桌子产生任何负面影响吗?
拿这个例子表:
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)
);
答案 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。