如果查询索引列的子集,是否会使用索引?

时间:2014-01-05 18:27:56

标签: mysql sql indexing

所以考虑我有下表:

表:

  • id(Int,Primary Key)
  • 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. 在此表上创建最佳索引是什么?

2 个答案:

答案 0 :(得分:5)

MySQL文档很好地解释了多列索引如何工作here

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

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

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

要优化所有这些组合,您可以创建两个索引:c1, c2, c3, c4c2, c1, c5。在第二个索引中交换c1c2的原因是,可以处理条件为c2但不是c1的查询,以及相反的情况。

答案 1 :(得分:2)

如果您使用ìndex on (c1,c2,c3)数据库将创建和索引良好的搜索... where c1=sth and c2=sth有或没有c3。

这比单独的指数表现更好。

但是如果你只需要C2作为where子句

,那就无济于事了

如果您只需要c3作为indext col,那么为它创建一个额外的索引。