MySQL复合索引是否需要覆盖选择列以及列?

时间:2014-06-02 13:29:02

标签: mysql indexing

让我们假设我的表A包含列a1, a2, a3, a4, a5.

让我们假设我有一个复合索引(a2,a3,a4)和PK索引(a1)

其中哪些查询将使用索引。

 1. SELECT * FROM A WHERE a2 = 'val1' AND a3 = 'val2';
 2. SELECT a1, a2, a3, a4 FROM A WHERE a2 = 'val1' AND a3 = 'val2';
 3. SELECT * FROM B INNER JOIN A ON B.b1 = A.a1 WHERE a2 = 'val1' AND a3 = 'val2';
 4. SELECT * FROM B INNER JOIN A ON B.b1 = A.a1 AND a2 = 'val1' AND a3 = 'val2';
 5. SELECT a5 FROM A WHERE a2 = 'val1' AND a3 = 'val2' AND a4 = 'val3';

如果上面的任何查询都没有使用索引,那么可以做任何事情吗? 索引是否必须覆盖要使用它的SELECT列,或者哪个部分足够?对于最后一个问题,我似乎找到了不同的意见。

提前致谢。

1 个答案:

答案 0 :(得分:0)

我认为这会根据您提供的内容总结索引用法:

  1. 将使用复合索引并在数据页中查找数据
  2. 仅使用复合索引
  3. 取决于查询计划,但可能使用复合索引并在数据页中查找数据
  4. 与(3)
  5. 相同
  6. 将使用复合索引并在数据页中查找数据
  7. 他们都应该使用索引。如果您想要这些查询的完整覆盖索引(因此没有额外的步骤来查找数据页中的数据),请将a5a1添加到复合索引(最后)。

    注意:MySQL确实对索引使用做了一些优化。以上是假设"正常"条件。例如,如果数据适合一个数据页面,那么MySQL可能会认为全表扫描是合适的。

    MySQL对复合索引的使用有很好的documentation(你称之为复合索引的术语更为习惯)。