我有一个包含 50 万行的表,如下所示:http://d.pr/njFJ
像这样的查询有时通常需要超过 2 秒:
SELECT *
FROM `alerts`
WHERE `a_timestamp` > '2012-04-15' AND `a_timestamp` <= '2012-04-16'
AND a_company_id IN(64,65,69,70,71,72,73,74,75,76,83,86,106,108,109,116,148) ORDER BY a_id DESC
这是解释查询:http://d.pr/z20b
有人可以指出我做错了什么吗?也许我错过了什么。这么小的 table 应该花那么多时间吗?
最佳答案
正如 KingFisher 提到的,去掉 IN
子句(这通常是查询性能的瓶颈)并用 JOIN
替换它,但不要使用临时的表,这是你如何做的:
SELECT alerts.* FROM (
(SELECT 64 AS id) UNION (SELECT 65) UNION (SELECT 69) UNION (SELECT 70)
UNION (SELECT 71) UNION (SELECT 72) UNION (SELECT 73) UNION ...
) AS ids
INNER JOIN alerts ON (ids.id = alerts.a_company_id)
WHERE alerts.a_timestamp > '2012-04-15' AND alerts.a_timestamp <= '2012-04-16'
ORDER BY ids.id DESC
并确保您在 a_company_id
上有一个索引。
关于mysql - 有什么改进 MySQL 查询的技巧吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10164722/