2013-08-04 79 views
2

我正在使用一个表格,其中有很多索引,实际上有8个索引。但他们中的一些似乎是多余的,例如,这里是其中的一些指标:现在数据库和多列索引(mySQL)

type  columns 
----- ------------------------------ 
index project_id 
unique project_id, user_id, event_id 
index project_id, user_id, type, subtype 

,据我所知,唯一的一个是必要的,因为它的预防这三个键的组合的重复,我们需要那。但是,不是不必要的第一个索引?

我做了一个快速的select * from activities where project_id = 5579,它使用4列索引(基于Explain)。用另一个查询,只需更改project_id,它就使用唯一索引。会不会有第一个索引仍在使用的情况,还是我可以安全地删除它?

这种情况也适用于user_id列 - 它自己编制索引,然后在其第一列有多列索引。

我的理解是更多索引=更慢的插入,所以我想我应该尝试删除不必要的。

+0

那么表是否受到慢插入的困扰?它破坏了什么吗?这里的问题在于,这些索引可能是针对运行缓慢的查询创建的,通过删除它们,您将创建另一个问题。请记住,如果它没有破解不修复它。 – Namphibian

+0

@Nafphibian该表每秒可获得大约30个插入,所以使其更好会是一件好事。我相信,由于第二和第三索引,删除第一个索引不会影响任何依赖于它的查询,但是我正在寻找可能比我更熟悉的人的验证。 – Will

+0

你的想法是正确的。我们能否看到所有的指标?它可能超过了索引。你能识别出针对这个表发出的所有查询吗? – Namphibian

回答

0

索引project_id, user_id, type, subtype涵盖了WHERE或GROUP BY本身仅指定project _id的情况。

0

关于复合索引需要注意的关键之一是索引中列出的字段的顺序很重要。

因此,对于你的索引project_id, user_id, event_id你只能用这个指标如果满足下列条件之一满足:

project_id在WHERE,GROUP BY,ORDER BY或JOIN条件 或 project_iduser_id是使用在WHERE,GROUP BY,ORDER BY或JOIN条件 或 project_iduser_id AS event_id在WHERE,GROUP BY,ORDER BY或JOIN条件

如果你厌倦了使用user_id用于使用或event_id自己,索引将不会被使用。如果您尝试使用user_idevent_id,则不会使用索引。如果您尝试使用project_idevent_id,则不会使用索引。

所以要回答你的问题,index_id索引可能不需要在这里是你要使用index_id本身`。

您当然必须全面了解表格可能被查询的所有可能方式,以便了解需要哪些索引以及哪些索引不需要。