数据库和多列索引(mySQL)

时间:2013-08-04 18:48:02

标签: mysql indexing

我正在使用一个看似很多索引的表 - 实际上是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列 - 它自己编制索引,然后在第一列有多列索引。

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分: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_idevent_id,则不会使用该索引。如果您尝试使用user_idevent_id,则不会使用索引。如果您尝试使用project_idevent_id,则不会使用索引。

所以为了回答你的问题,这里可能不需要index_id索引你是否会单独使用index_id

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