为什么使用"或"进行示例查询?不使用索引?

时间:2017-05-06 01:05:19

标签: php mysql sql

我正在阅读mysql manual

以下是手册中的示例。

示例创建Multiple-Column Indexes,索引为(last_name,first_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';

但下面or的查询不会使用index:

SELECT * FROM test
  WHERE last_name='Widenius' OR first_name='Michael';

问题

为什么使用or进行示例查询,即为什么

SELECT * FROM test
      WHERE last_name='Widenius' OR first_name='Michael';

不使用索引?

1 个答案:

答案 0 :(得分:2)

只需说数据库不擅长优化OR子句中的IN(或NOT INWHERE}条件。

在较高的层面上,我可能会将原因描述如下。当条件使用AND连接时,第一个缩小了用于第二个的人口。这使得索引可行,因为条件" nest"。使用OR时,条件是独立的。我应该注意到,有些数据库可以比其他数据库更好地处理OR条件。

如果您希望代码使用索引,可以使用UNION ALL

SELECT t.*
FROM test t
WHERE last_name = 'Widenius'
UNION ALL
SELECT t.*
FROM test t
WHERE last_name <> 'Widenius' AND first_name = 'Michael';

为获得最佳效果,您需要test(last_name)test(first_name, last_name)上的索引。