让我们假设我的表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列,或者哪个部分足够?对于最后一个问题,我似乎找到了不同的意见。
提前致谢。
答案 0 :(得分:0)
我认为这会根据您提供的内容总结索引用法:
他们都应该使用索引。如果您想要这些查询的完整覆盖索引(因此没有额外的步骤来查找数据页中的数据),请将a5
和a1
添加到复合索引(最后)。
注意:MySQL确实对索引使用做了一些优化。以上是假设"正常"条件。例如,如果数据适合一个数据页面,那么MySQL可能会认为全表扫描是合适的。
MySQL对复合索引的使用有很好的documentation(你称之为复合索引的术语更为习惯)。