🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
mysql允许在相同列上创建多个索引,无论是有意还是无意的,mysql需要单独维护重复主键索引,并且优化器在优化查询的时候也需要逐个进行考虑,这会影响性能 重复索引是指在相同列上按照相同的顺序创建的相同类型的索引,应该避免这样创建重复索引,发现以后也应立即删除 有时候会在不经意之间创建了重复索引,例如下面的代码 ~~~ create table test ( id int not null primary key, A int not null, B int not null, unique(id), index(id) )engine=Innodb; ~~~ 用户可能想创建一个主键,先加上唯一限制,然后再加上索引以供查询使用.事实上,mysql的唯一限制和主键限制都通过索引实现的. 因此,上面的写法实际上在相同的列上创建了三个重复的索引.通常并没有这样做,除非是在同一列上创建不同类型的索引来满足不同的查询需求 如果索引类型不同,并不算是重复索引.例如经常有很好的理由创建key(col)和fulltext key(col)两种索引 表中的索引越多插入的速度越慢,一般来说,增加新索引将会导致insert update delete操作变慢,特别是当新增索引后导致达到内存瓶颈的时候 解决冗余索引和重复索引很简单,删除这些索引就可以,但首先要做的是找出这样的索引,可以通过写一些复杂的访问INFORMATION_SCHEMA表的查询来找,也可以使用pt-duplicate-key-checker,该工具通过分析表结构来找出冗余和重复的索引 在决定哪些索引可以被删除的时候要非常小心,innodb的示例中,因为二级索引的叶子节点包含了主键值,所以在列A上的索引相当于 (A,ID)上的索引.如果有像 where A = 5 order by ID这样的查询,这个索引会很有作用,如果把索引扩展为(A,B),则实际上会变为(A,B,ID),那么上面查询的order by 子句就无法使用索引排序,只能用文件排序了,所以建议用Percona工具中的pt-upgrade工具来仔细检查计划中的索引变更