【发布时间】:2015-05-13 12:10:13
【问题描述】:
以下查询需要 18 分钟才能完成。如何优化它以更快地执行?
基本上,我对每个公民的查询从citizens_static 和citizens_dynamic 表中加入行,其中update_id_to 列最高。
INSERT INTO latest_tmp (...)
SELECT cs1.*, cd1.*
FROM citizens c
JOIN citizens_static cs1 ON c.id = cs1.citizen_id
JOIN citizens_dynamic cd1 ON c.id = cd1.citizen_id
JOIN (
SELECT citizen_id, MAX(update_id_to) AS update_id_to
FROM citizens_static
GROUP BY citizen_id
) AS cs2 ON c.id = cs2.citizen_id AND cs1.update_id_to = cs2.update_id_to
JOIN (
SELECT citizen_id, MAX(update_id_to) AS update_id_to
FROM citizens_dynamic
GROUP BY citizen_id
) cd2 ON c.id = cd2.citizen_id AND cd1.update_id_to = cd2.update_id_to;
latest_tmp 表是 MyISAM 表,在导入期间禁用了索引。禁用它们将执行时间从 20 分钟缩短到 18 分钟,因此这不是最大的问题。
我还用WHERE t2.column IS NULL 对LEFT JOIN 方法进行了基准测试。与我使用的 INNER JOIN 方法相比,它需要几个小时。
解释下面的查询输出。它似乎正在使用索引。
citizens_dynamic 和 citizens_static 在 citizen_id,update_id_to 上具有主键,在 update_id_to,citizen_id 列上具有名为“id”的辅助键。
【问题讨论】:
标签: mysql query-optimization greatest-n-per-group