首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于IN子句和子查询的极端查询优化

问基于IN子句和子查询的极端查询优化
EN

Stack Overflow用户
提问于 2014-12-29 12:11:22
回答 1查看 63关注 0票数 0

我的桌子刚才有一千五百万行。我需要运行这样的查询:

代码语言:javascript
复制
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

你有什么办法使它更快吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-29 12:21:11

我发现,与关联子查询相比,MySQL在连接方面的性能更好。

代码语言:javascript
复制
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)

此外,请参阅本问题中的其他方法:

Retrieving the last record in each group

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27688637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档