【问题标题】:Performance of MYSQL "IN"MYSQL“IN”的性能
【发布时间】:2009-10-08 13:05:35
【问题描述】:

我分两步运行 MYSQL 查询。首先,我通过一个查询获得一个 id 列表,然后我使用第二个查询检索这些 id 的数据,类似于SELECT * FROM data WHERE id in (id1, id2 ...)。我知道这听起来很老套,但我这样做是因为查询非常复杂;第一个涉及很多几何和触发计量,第二个涉及很多不同的连接。我确信它们可以写在一个查询中,但我的 MYSQL 还不够好,无法完成。

这种方法有效,但它感觉不对;另外我担心它不会扩展。目前我正在测试一个包含 10,000 条记录的数据库,“IN”子句中有 400 个 id(即 IN (id1, id2 ... id400) )并且性能很好。但是如果有 1,000,000 条记录呢?

这种查询的性能瓶颈(速度、内存等)在哪里?关于如何重构这种查询的任何想法也很棒。 (例如,如果值得关注存储过程)。

【问题讨论】:

  • 你为什么不提供更多的查询细节?
  • 我想我不是在询问任何特定的查询;而只是原则上使用带有巨大参数列表的“IN”是一个好主意

标签: mysql performance


【解决方案1】:

从一定数量的记录开始,SELECT 上的IN 谓词变得比常量列表上的更快。

在我的博客中查看这篇文章以获得性能比较:

如果IN子句中查询使用的列被索引,像这样:

SELECT  *
FROM    table1
WHERE   unindexed_column IN
        (
        SELECT  indexed_column
        FROM    table2
        )

,那么这个查询只是优化为EXISTS(它只为table1中的每条记录使用一个条目)

不幸的是,MySQL 无法执行效率更高的HASH SEMI JOINMERGE SEMI JOIN(尤其是在两列都被索引的情况下)。

【讨论】:

  • 这对我也很有帮助。好文章。
【解决方案2】:

为什么要先提取 id?您可能应该只是加入表格。如果您将 id 用于其他用途,您可以将它们插入之前的临时表中,然后使用该表进行连接。

【讨论】:

  • 是的,你可能是对的。我首先进行提取,因为提取查询非常复杂(大量的数学,一些子查询等),而且我的小脑袋无法同时进行连接.. 真的只是想知道我是否应该是否将该重构放在我的待办事项列表的顶部!
  • 那么你应该把它们放在一个临时表中。这比获取它们并构建 in 子句要简单。 Quassnoi 说它会更快。
猜你喜欢
  • 1970-01-01
  • 2010-10-21
  • 1970-01-01
  • 2016-03-16
  • 1970-01-01
  • 2021-11-03
  • 2013-08-07
  • 1970-01-01
相关资源
最近更新 更多