2016-10-31 56 views
1

讀取的MySQL docs我們看到多列索引name此示例表:如果我按不同順序使用列,MySQL會使用多列索引嗎?

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是否嘗試交換列以找到合適的索引,還是完全取決於查詢?

+0

你爲什麼不只是運行一個測試,找出? – arkascha

+0

@arkascha也許它可能適用於某些存儲引擎,而不適用於其他人。也許在服務器/數據庫/表配置上還有其他隱藏的依賴。我無法測試所有可能的配置... –

+0

我很確定測試的順序沒有區別。 – Barmar

回答

2

應該是一樣的,因爲(從MySQL DOC)查詢optiminzer工作望着

每個表的索引被查詢,並且使用最好的索引,除非 優化認爲,這是更有效地使用表掃描。在 一次,根據最佳索引是否超過表格的30%使用掃描,但固定百分比不再決定使用索引或掃描之間的選擇。優化器現在更復雜,並將其估計基於其他因素,如表 大小,行數和I/O塊大小。

http://dev.mysql.com/doc/refman/5.7/en/where-optimizations.html

在某些情況下,MySQL能夠甚至沒有 諮詢數據文件從索引讀取行。

,這應該是你的情況下

沒有ICP,存儲引擎遍歷來定位 基本的錶行的索引,並將其返回到評估 WHERE條件的MySQL服務器行。啓用ICP後,如果只使用 索引中的字段可以評估WHERE條件的部分內容,則MySQL服務器將WHERE條件的這一部分向下推入存儲引擎 。然後,存儲引擎通過使用索引條目評估推送的 索引條件,並且只有在滿足該條件時 是從表中讀取的行。 ICP可以減少 存儲引擎必須訪問基表的次數以及MySQL服務器必須訪問存儲引擎的次數。

http://dev.mysql.com/doc/refman/5.7/en/index-condition-pushdown-optimization.html

2

對於你所說的兩個查詢,它會工作相同。

但是,對於只有一列的查詢,索引的順序很重要。

例如,這將使用索引:

SELECT * FROM test WHERE last_name='Widenius'; 

但這不會:

SELECT * FROM test WHERE first_name='Michael';