我有一个500K行的表,如下所示: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
有人可以指出我做错了什么吗?也许我错过了什么。在这么小的桌子上花这么多时间吗?
答案 0 :(得分:2)
正如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
上有索引。
答案 1 :(得分:1)
尝试消除IN
子句。它扫描整个表中的每个值
导致性能下降的IN clause
。
你可以使用临时表来存储id,并在临时表中使用带有id的JOIN,而不是使用in
子句,
答案 2 :(得分:1)
尝试在(a_company_id,a_timestamp)上创建索引...与type_ts_company索引的顺序相反。