以下查询将永远消失,任何人都可以加快速度 请注意,我确实有很多数据会延误这个过程..
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
答案 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.)
最后,请考虑您的子查询正在评估整个movement
和noise
表。两者都产生可能考虑的结果,甚至包含来自这些表的所有行。一旦两个子查询合并(使用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.time
和movement.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);