我正在阅读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';
不使用索引?
答案 0 :(得分:2)
只需说数据库不擅长优化OR
子句中的IN
(或NOT IN
或WHERE
}条件。
在较高的层面上,我可能会将原因描述如下。当条件使用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)
上的索引。