【问题标题】:Databases and Multi-Column Indexes (mySQL)数据库和多列索引 (mySQL)
【发布时间】:2013-08-04 18:48:02
【问题描述】:

我正在使用一个包含很多索引的表 - 实际上是 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 列 - 它自己索引,然后在其第一列处具有多列索引。

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

【问题讨论】:

  • 那么表是否存在插入缓慢的问题?是不是破坏了什么?这里的问题是,这些索引可能是为运行缓慢的查询而创建的,删除它们会产生另一个问题。请记住,如果它没有损坏,请不要修复它。
  • @Namphibian 该表每秒插入约 30 次,因此改进它会是一件好事。我相信,由于第二个和第三个索引,删除第一个索引不会影响任何依赖它的查询,但我正在寻找可能比我了解更多的人来验证这一点。
  • 你的想法是正确的。我们能看到所有的索引吗?它可能被过度索引。您能识别出针对此表发出的所有查询吗?

标签: mysql indexing


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    project_id 用于 WHERE、GROUP BY、ORDER BY 或 JOIN 条件 或者 project_id AND user_id 用于 WHERE、GROUP BY、ORDER BY 或 JOIN 条件 或者 project_id AND user_id AS event_id 用于 WHERE、GROUP BY、ORDER BY 或 JOIN 条件

    如果您厌倦了自己使用user_idevent_id,则不会使用索引。如果您尝试使用user_idevent_id,则不会使用索引。如果您尝试使用project_idevent_id,则不会使用索引。

    所以要回答您的问题,这里可能不需要index_id 索引,您要单独使用index_id

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

    【讨论】:

      猜你喜欢
      • 2018-02-21
      • 1970-01-01
      • 2011-09-11
      • 1970-01-01
      • 1970-01-01
      • 2016-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多