我的桌子刚才有一千五百万行。我需要运行这样的查询:
SELECT ch1.* FROM citizens_dynamic ch1
WHERE ch1.id IN (4369943, ..., 4383420, 4383700)
AND ch1.update_id_to = (
SELECT MAX(ch2.update_id_to)
FROM citizens_dynamic ch2
WHERE ch1.id = ch2.id AND ch2.update_id_to < 812
)基本上,对于IN子句中的每个公民,它都会搜索最近但低于指定update_id_to的行。
在2列update_id_to, id列上有主键。目前,这个查询在0.9s中执行( IN子句中有100个is )。它仍然太慢,我需要运行我的脚本3天才能完成。
在下面您可以看到我的EXPLAIN输出。

id索引就像主键,但是有相反的列:id, update_id_to
你有什么办法使它更快吗?
发布于 2014-12-29 12:21:11
我发现,与关联子查询相比,MySQL在连接方面的性能更好。
SELECT ch1.*
FROM citizens_dynamic AS ch1
JOIN (SELECT id, MAX(update_id_to) AS update_id_to
FROM citizens_dynamic
WHERE id IN (4369943, ..., 4383420, 4383700)
GROUP BY id) AS ch2
ON ch1.id = ch2.id
WHERE ch1.id IN (4369943, ..., 4383420, 4383700)此外,请参阅本问题中的其他方法:
https://stackoverflow.com/questions/27688637
复制相似问题