[英]Why the example query with “or” do not use index?
我正在閱讀mysql 手冊 ,
這是手冊中的示例。
該示例創建一個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';
不使用索引?
可以說數據庫不擅長在WHERE
子句中優化OR
(或IN
或NOT IN
)條件。
在較高的層次上,我可能將原因描述如下。 當條件使用AND
連接時,第一個縮小第二個使用的總體。 由於條件“嵌套”,因此使索引可行。 使用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)
上建立索引。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.