【问题标题】:Will indexes get used if you query a subset of the columns of the index?如果您查询索引列的子集,是否会使用索引?
【发布时间】:2014-01-05 18:27:55
【问题描述】:

所以考虑一下我有下表:

表:

  • id(整数,主键)
  • c1
  • c2
  • c3
  • c4
  • c5

假设我使用在运行时不同的查询(例如一个网站,其中复选框表示是否在特定字段上搜索),一些可能的情况:

(使用一些x, y, z 作为值)

  • SELECT * FROM table WHERE c1 = 1 AND c2 = 2
  • SELECT * FROM table WHERE c1 = 1 AND c2 = 2 AND c3 = x AND c4 = y
  • SELECT * FROM table WHERE c1 = 2 AND c2 = 3
  • SELECT * FROM table WHERE c1 = 2 AND c2 = 3 AND c5 = z

问题:

  1. 索引对(c1, c2, c3, c4, c5) 有什么影响?它将如何在多个查询中使用?
  2. 在此表上创建最佳索引是什么?

【问题讨论】:

标签: mysql sql indexing


【解决方案1】:

MySQL 文档很好地解释了多列索引的工作原理here。

一般来说,当索引最左侧的一些列具有相等条件时,索引可以用于where子句。您的 where 子句使用以下列:

  • c1, c2
  • c1、c2、c3、c4
  • c1, c2
  • c1、c2、c5

任何以列c1 和c2 开头的索引通常都会用于这些查询。 MySQL 可以应用其他条件来使用索引,例如选择性。也就是说,如果c1 和c2 具有常量值(例如),那么使用索引不会有利于查询。

要优化所有这些组合,您可以创建两个索引:c1, c2, c3, c4 和 c2, c1, c5。在第二个索引中交换c1 和c2 的原因是您可以处理条件为c2 而不是c1 的查询,反之亦然。 p>

【讨论】:

  • 如果我是正确的 WHERE 子句本身的顺序无关紧要?我希望 MySQL 足够聪明,能够自己解决这个问题。我知道由于索引是物理存储的,因此无法完成。
  • @skiwi 。 . . where(或on 子句)中的条件顺序无关紧要。但是,平等与不平等有很大不同。
【解决方案2】:

如果您使用 ìndex on (c1,c2,c3),数据库将创建并索引适合搜索 ... where c1=sth and c2=sth 使用或不使用 c3。

这将比单独的索引执行得更好。

但如果你只需要 C2 作为 where 子句,它在某种程度上是无用的

如果您也只需要 c3 作为 indext col,则为它创建一个附加索引。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-21
    • 1970-01-01
    相关资源
    最近更新 更多