这是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