有关改进MySQL查询的提示吗?

时间:2012-04-15 18:18:38

标签: mysql performance indexing query-optimization

我有一个500K行的表,如下所示:http://d.pr/njFJ

enter image description here

这样的查询通常需要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

enter image description here

有人可以指出我做错了什么吗?也许我错过了什么。在这么小的桌子上花这么多时间吗?

3 个答案:

答案 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索引的顺序相反。