這是InnoDB with MySQL 5.7的索引。MySQL - 相關級聯查詢集合的最佳索引
我有一組4個相關的級聯查詢:
SELECT DISTINCT A, COUNT(*) FROM MYTABLE
WHERE D IN ? AND A > ?
GROUP BY A ORDER BY A LIMIT 100
SELECT DISTINCT B, COUNT(*) FROM MYTABLE
WHERE A = ? AND D IN ? AND B > ?
GROUP BY B ORDER BY B LIMIT 100
SELECT DISTINCT C, COUNT(*) FROM MYTABLE
WHERE A = ? AND B = ? AND D IN ? AND C > ?
GROUP BY C ORDER BY C LIMIT 100
SELECT E, F, G, H FROM MYTABLE
WHERE A = ? AND B = ? AND C = ? AND D IN ? AND ID > ?
ORDER BY ID LIMIT 100
什麼是最低組索引(ES),使得所有的查詢可以使用索引(ES)的一個由每個修剪的他們的WHERE子句,並使用它/他們來加快ORDER BY?
據我瞭解關於複合索引,我需要:
CREATE INDEX INDEX01 ON MYTABLE (D, A)
CREATE INDEX INDEX02 ON MYTABLE (A, D, B)
CREATE INDEX INDEX03 ON MYTABLE (A, B, D, C)
CREATE INDEX INDEX04 ON MYTABLE (A, B, C, D)
(ID是主鍵列)
這是正確的嗎?
我想如果我重新排列WHERE子句,我可能用只一個綜合指數:
SELECT DISTINCT A, COUNT(*) FROM MYTABLE
WHERE D IN ? AND A > ?
GROUP BY A ORDER BY A LIMIT 100
SELECT DISTINCT B, COUNT(*) FROM MYTABLE
WHERE D IN ? AND A = ? AND B > ?
GROUP BY B ORDER BY B LIMIT 100
SELECT DISTINCT C, COUNT(*) FROM MYTABLE
WHERE D IN ? AND A = ? AND B = ? AND C > ?
GROUP BY C ORDER BY C LIMIT 100
SELECT E, F, G, H FROM MYTABLE
WHERE D IN ? AND A = ? AND B = ? AND C = ? AND ID > ?
ORDER BY ID LIMIT 100
那麼我就需要:
CREATE INDEX INDEX01 ON MYTABLE (D, A, B, C)
是正確的嗎?
但是,我認爲以這種方式排列WHERE子句並不是最優的。之所以總是試圖把「IN」操作,並作爲最後2 WHERE子句是「>」運行:
的MySQL需要做的「IN」更多的工作(有多個值進行比較)與「=」相比,可能(由於我的數據集和我正在過濾的內容),較少的行將被這個子句修剪。
「>」操作主要用於分頁目的。即在某些情況下,由於此條款的限制,幾乎不會修剪。
我的理解是否正確?
這取決於你的數據類型爲真實世界的健康系統。它們是精簡還是加載varchar(255) – Drew
請參閱[this](http://stackoverflow.com/a/38002986)有關Optimizer和'IN' – Drew