2016-10-31 30 views
1

读取的MySQL docs我们看到多列索引name此示例表:如果我按不同顺序使用列,MySQL会使用多列索引吗?

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

你为什么不只是运行一个测试,找出? – arkascha

+0

@arkascha也许它可能适用于某些存储引擎,而不适用于其他人。也许在服务器/数据库/表配置上还有其他隐藏的依赖。我无法测试所有可能的配置... –

+0

我很确定测试的顺序没有区别。 – Barmar

回答

2

应该是一样的,因为(从MySQL DOC)查询optiminzer工作望着

每个表的索引被查询,并且使用最好的索引,除非 优化认为,这是更有效地使用表扫描。在 一次,根据最佳索引是否超过表格的30%使用扫描,但固定百分比不再决定使用索引或扫描之间的选择。优化器现在更复杂,并将其估计基于其他因素,如表 大小,行数和I/O块大小。

http://dev.mysql.com/doc/refman/5.7/en/where-optimizations.html

在某些情况下,MySQL能够甚至没有 咨询数据文件从索引读取行。

,这应该是你的情况下

没有ICP,存储引擎遍历来定位 基本的表行的索引,并将其返回到评估 WHERE条件的MySQL服务器行。启用ICP后,如果只使用 索引中的字段可以评估WHERE条件的部分内容,则MySQL服务器将WHERE条件的这一部分向下推入存储引擎 。然后,存储引擎通过使用索引条目评估推送的 索引条件,并且只有在满足该条件时 是从表中读取的行。 ICP可以减少 存储引擎必须访问基表的次数以及MySQL服务器必须访问存储引擎的次数。

http://dev.mysql.com/doc/refman/5.7/en/index-condition-pushdown-optimization.html

2

对于你所说的两个查询,它会工作相同。

但是,对于只有一列的查询,索引的顺序很重要。

例如,这将使用索引:

SELECT * FROM test WHERE last_name='Widenius'; 

但这不会:

SELECT * FROM test WHERE first_name='Michael';