同一列上的两个索引

Get*_*awn 11 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)
);
Run Code Online (Sandbox Code Playgroud)

Bil*_*win 15

是的,它会产生影响.

当然,如果使用这两个索引,则在磁盘上以及内存中占用额外空间.

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

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

如果你有兴趣,Percona Toolkit有一个工具pt-duplicate-key-checker,可以在你的所有表中搜索这样的情况.