无法在数据库中的10,000个设备上查找最近的同步,超过1亿行

时间:2014-08-26 02:18:01

标签: mysql

我的数据库有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);

查询永远运行。是的,字段已编入索引。任何想法如何使这项工作?

2 个答案:

答案 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;