2

我正在使用一个看起来有很多索引的表——实际上是 8 个。但其中一些似乎是多余的,例如,这里有一些索引:

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 列 - 它由自身索引,然后在其第一列的位置具有多列索引。

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

4

2 回答 2

0

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

于 2013-08-08T15:37:58.410 回答
0

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

因此,对于您的索引project_id, user_id, event_id,您只能在满足以下条件之一时使用此索引:

project_id用于 WHERE、GROUP BY、ORDER BY 或 JOIN 条件 OR project_idANDuser_id用于 WHERE、GROUP BY、ORDER BY 或 JOIN 条件 OR project_idAND user_idASevent_id用于 WHERE、GROUP BY、ORDER BY 或 JOIN 条件

如果你累了user_id还是event_id自己用,索引就不会用了。如果您尝试使用user_id并且event_id索引将不会被使用。如果您尝试使用project_id并且event_id索引将不会被使用。

因此,要回答您的问题,index_id此处可能不需要索引,您将自己使用index_id该索引。

当然,您必须充分了解查询表的所有可能方式,以便了解哪些索引是必需的,哪些是不需要的。

于 2013-08-08T15:45:40.860 回答