これはMySQL 5.7のInnoDB用です。MySQL - 関連するカスケードクエリのセットの最適インデックス
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)などの最小限のセットを何ですか:
私は4つの関連のカスケードクエリのセットを持っています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句をこのように並べると最適ではないと思います。常に節があり、最後の2として「IN」操作と「>」の操作を置くしようとしている理由:
MySQLは「IN」のためのより多くの作業を行う必要があります(複数の値と比較) "="と比較して、おそらく(私のデータセットと私がフィルタリングしているもののために)、この節によって少ない行が刈り込まれます。
">"操作は、主に改行の目的に使用されます。すなわち、場合によっては、この節のために枝刈りがほとんどまたは全くない。
私の理解は正しいですか?
それは現実世界の健康システムのためにあなたのデータ型に依存します。それらは薄くなっているか、またはロードされていますか?varchar(255) – Drew
オプティマイザについては[this](http://stackoverflow.com/a/38002986)を、 – Drew