我的数据库有1.47亿行代表POS设备交易。我需要找到10,000个设备的最新交易。我正在使用具有20个处理器和240GB RAM以及RAID 0 SSD的服务器。 MySQL配置为使用所有服务器资源。
这是SQL查询:
select v1.device_id as device_id, v1.module_id as module_id, v1.db_sync_done as
db_sync_done, v1.machine_id as machine_id
from report2 v1 where v1.db_sync_done =
(select max(v2.db_sync_done) from report2 v2 where v1.device_id = v2.device_id);
查询永远运行。是的,字段已编入索引。任何想法如何使这项工作?
答案 0 :(得分:1)
一些评论。
您的原始查询将为内部SELECT MAX ...
生成“相关子查询”,这意味着将对v1
表中的每一行评估内部查询,确实性能非常差。
SELECT v1.device_id as device_id, v1.module_id as module_id,
v1.db_sync_done as db_sync_done, v1.machine_id as machine_id
FROM report2 v1
WHERE v1.db_sync_done =
(SELECT MAX(v2.db_sync_done) FROM report2 v2 WHERE v1.device_id = v2.device_id);
但是当您在自我回答中运行查询时,asum
会被评估一次,因此它比原始查询更快。
SELECT a.*
FROM vs_metrics_report a INNER JOIN
(SELECT device_id, MAX(metric_id) as metric_id
FROM vs_metrics_report
GROUP BY device_id
) asum ON asum.device_id = a.device_id AND a.metric_id = asum.metric_id
ORDER BY a.metric_id DESC;
答案 1 :(得分:0)
试过这个并获得更快的结果,但所有行都返回,所以它没用。我需要不同的设备。 :(
select a.*
from vs_metrics_report a join
(select device_id, max(metric_id) as metric_id
from vs_metrics_report
group by device_id
) asum
on asum.device_id = a.device_id and a.metric_id = asum.metric_id
order by a.metric_id DESC;