【发布时间】:2021-06-05 05:02:27
【问题描述】:
我有一个包含大约 1M 数据的表。我正在执行这个查询,获取记录大约需要 0.9 秒。
SELECT
c.id, c.tag
FROM
table as c
WHERE
c.manufacturer = "some value"
AND c.power = "some value"
AND c.bolt = "some value"
AND c.cylinder = "some value"
AND c.drive = "some value"
AND c.minSize <= "some value"
AND c.speedMin = "some value"
AND c.lengthMin >= "some value"
AND c.widthMin >= "some value"
GROUP BY c.manufacturer, c.class, c.version, c.minSize, c.bolt, c.innerBoltF, c.innerBoltR, c.body, c.drive, c.lengthMin, c.lengthMax, c.widthMin, c.widthMax, c.seats, c.speedMax, c.speedMin
我有索引列manufacturer, power
EXPLAIN 给我以下结果:
SIMPLE c index_merge 制造商,电源制造商,电源 77,4 57 使用 intersect(manufacturer,power);使用哪里;使用临时的;使用文件排序
在某些情况下,我可能会查询速度、长度和宽度的范围
例如c.lengthMin >= "some value" AND c.lengthMin < "some value"
我不确定 0.9s 是否是一个不错的速度。
但就我而言,我必须使用 UNION ALL。假设上面的查询是基于某些条件的 Query1,我的最终查询看起来像
Query1 UNION ALL Query2 UNION ALL Query3 ....
因此,对于大约 100 个 UNION ALL 条件,单次执行大约需要 3-5 分钟,这比较慢。我必须使用 UNION ALL,因为我需要知道根据条件执行的是哪一列。
是否可以添加更多索引以更快地执行查询?我应该为哪些列编制索引?
请帮忙。
【问题讨论】:
-
您没有使用任何聚合函数。为什么你使用 group by 子句?
-
@AmitVerma 你的意思是使用 DISTINCT 而不是 GROUP BY 吗?
-
我在问为什么使用 group by 子句。
-
@Strawberry 我用解释更新了问题
-
您在滥用 MySQL 臭名昭著的非标准 GROUP BY 实现。请read this。而且,100 个 UNION ALL 子句意味着 100 个子查询,每个子查询都可能需要不同的索引才能有效地满足。
标签: mysql indexing query-optimization