如果我使用不同顺序的列,MySQL会使用多列索引吗?

时间:2016-10-31 22:19:01

标签: mysql

阅读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是否尝试交换列以查找适当的索引,或者这完全取决于查询?

2 个答案:

答案 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';