阅读MySQL docs我们看到这个示例表有多列索引name
:
CREATE TABLE test (
id INT NOT NULL,
last_name CHAR(30) NOT NULL,
first_name CHAR(30) NOT NULL,
PRIMARY KEY (id),
INDEX name (last_name,first_name)
);
通过示例说明将使用或不使用索引的情况。例如,它将用于此类查询:
SELECT * FROM test
WHERE last_name='Widenius' AND first_name='Michael';
我的问题是,它是否适用于此查询(实际上是相同的):
SELECT * FROM test
WHERE first_name='Michael' AND last_name='Widenius';
我在文档中找不到任何关于这一点的信息 - MySQL是否尝试交换列以查找适当的索引,或者这完全取决于查询?
答案 0 :(得分:2)
应该是相同的,因为(来自mysql doc)查询optiminzer查看工作
查询每个表索引,除非使用最佳索引 优化器认为使用表扫描更有效。在 有一次,根据最佳指数是否跨越更多来使用扫描 比表的30%,但固定的百分比不再决定 在使用索引或扫描之间进行选择。优化器现在更多 复杂并基于其他因素(如表格)进行估算 大小,行数和I / O块大小。
http://dev.mysql.com/doc/refman/5.7/en/where-optimizations.html
在某些情况下,MySQL可以无需读取索引中的行 咨询数据文件。
这应该是你的情况
如果没有ICP,存储引擎会遍历索引以查找行 基表并将它们返回给评估的MySQL服务器 行的WHERE条件。启用ICP,如果启用了部分 只使用来自的字段可以评估WHERE条件 索引,MySQL服务器将WHERE条件的这一部分推下来 到存储引擎。然后存储引擎评估推送 索引条件通过使用索引条目并且仅在满足此条件时 是从表中读取的行。 ICP可以减少次数 存储引擎必须访问基表和次数 MySQL服务器必须访问存储引擎。
http://dev.mysql.com/doc/refman/5.7/en/index-condition-pushdown-optimization.html
答案 1 :(得分:2)
对于您所说的两个查询,它的工作方式相同。
但是,对于只有一列的查询,索引的顺序很重要。
例如,这将使用索引:
SELECT * FROM test WHERE last_name='Widenius';
但这不会:
SELECT * FROM test WHERE first_name='Michael';