簡體   English   中英

為什么帶有“或”的示例查詢不使用索引?

[英]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 (或INNOT 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM