以下查询需要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分钟,因此这不是最大的问题。我还用
LEFT JOIN
对WHERE t2.column IS NULL
方法进行了基准测试。与我正在使用的INNER JOIN
方法相比,它需要花费几个小时。在下面解释查询输出。似乎正在使用索引。
citizens_dynamic
和citizens_static
在citizen_id,update_id_to
上具有主键,在update_id_to,citizen_id
列上具有名为“ id”的辅助键。 最佳答案
您能用英语解释您想要什么吗?
然后查看Groupwise Max并根据需要编辑以下内容:
SELECT
province, n, city, population
FROM
( SELECT @prev := '', @n := 0 ) init
JOIN
( SELECT @n := if(province != @prev, 1, @n + 1) AS n,
@prev := province,
province, city, population
FROM Canada
ORDER BY
province,
population DESC
) x
WHERE n <= 3
ORDER BY province, n;
无论内部ORDER BY上的ASC / DESC如何,都将进行全表扫描和“文件排序”。
关于mysql - 每个组的一般最大N值太慢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28991099/