1

我有一个 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

在此处输入图像描述

有人可以指出我做错了什么吗?也许我错过了一些东西。这么小的桌子要花那么多时间吗?

4

3 回答 3

2

正如 KingFisher 提到的,去掉该IN子句(这通常是查询性能的瓶颈)并将其替换为 a 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.

于 2012-04-15T18:46:57.513 回答
1

尝试在 (a_company_id, a_timestamp) 上创建索引...与 type_ts_company 索引相反的顺序。

于 2012-06-02T14:51:44.953 回答
1

尽量去掉IN子句。它会扫描整个表中的每个值, IN clause从而导致性能下降。

您可以使用临时表来存储 id,并在临时表中使用 JOIN 和 id 而不是 usingin子句,

于 2012-04-15T18:36:02.700 回答