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

ski*_*iwi 3 mysql sql indexing

所以考虑我有下表:

表:

  • id(Int,主键)
  • 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. 在这张桌子上创建最好的索引是什么?

Gor*_*off 6

MySQL文档很好地解释了多列索引在这里的工作原理.

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

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

任何指数开始列c1c2通常会被用于这些查询.MySQL可以应用其他条件来使用索引,例如选择性.也就是说,如果c1并且c2具有常量值(例如),那么使用索引将不会使查询受益.

要优化所有这些组合,您可以创建两个索引: c1, c2, c3, c4c2, c1, c5.交换c1c2第二个索引的原因是你可以处理条件开启c2但不是c1反向的查询.