mysql查询正在永远加载

时间:2016-07-18 15:03:50

标签: mysql

以下查询将永远消失,任何人都可以加快速度 请注意,我确实有很多数据会延误这个过程..

SELECT * FROM
(
select t1.time,t1.noise,t2.movement 
from noise t1 left join movement t2
on t1.time = t2.time
UNION
select t2.time,
t1.noise,t2.movement 
from noise t1 right join movement t2
on t1.time = t2.time
) tab
where time >= DATE_SUB(NOW(), INTERVAL 7 HOUR)
ORDER BY time

2 个答案:

答案 0 :(得分:1)

一些有用的提示可帮助您识别瓶颈并提高查询效果:

首先,对EXPLAIN的每个查询使用understand how MySQL will process the query命令。它将显示运行查询时必须考虑的行数,表将如何连接以及将使用哪些索引。这称为执行计划

例如:

EXPLAIN SELECT t1.time, t1.noise, t2.movement 
FROM noise t1
LEFT JOIN movement t2 ON t1.time = t2.time;

该查询将显示第一个子查询的执行计划。

正如@mikeb在他的回答中建议的那样,你将需要在没有它们的表上创建索引来加速查询。将索引视为特定列的“目录”。 (How MySQL uses indexes.

最后,请考虑您的子查询正在评估整个movementnoise表。两者都产生可能考虑的结果,甚至包含来自这些表的所有行。一旦两个子查询合并(使用UNION),外部查询将根据time列(仅保留最近7小时)消除行。您可能希望将此条件逻辑移动到子查询中以仅生成您感兴趣的行。将这些结果联合起来,然后按时间顺序排列。

类似的东西:

SELECT * FROM
(
    SELECT t1.time, t1.noise, t2.movement 
    FROM noise t1
    LEFT JOIN movement t2
        ON t1.time = t2.time
    WHERE t1.time >= DATE_SUB(NOW(), INTERVAL 7 HOUR)
        AND t2.time >= DATE_SUB(NOW(), INTERVAL 7 HOUR)

    UNION

    SELECT t2.time, t1.noise, t2.movement 
    FROM noise t1
    RIGHT JOIN movement t2
        ON t1.time = t2.time
    WHERE t1.time >= DATE_SUB(NOW(), INTERVAL 7 HOUR)
        AND t2.time >= DATE_SUB(NOW(), INTERVAL 7 HOUR)
) tab
ORDER BY time;

答案 1 :(得分:0)

我不确定没有您的表格结构,但根据您的查询,您需要在noise.timemovement.time上添加索引

http://dev.mysql.com/doc/refman/5.7/en/create-index.html

CREATE INDEX ix_noise_time ON noise (time);
CREATE INDEX ix_movement_time ON movement (time);