当前位置: 首页 > 面试题库 >

MYSQL“ IN”的性能

丰俊艾
2023-03-14
问题内容

我分两个步骤运行MYSQL查询。首先,通过一个查询获取ID列表,然后使用第二个查询沿的方式检索这些ID的数据SELECT * FROM data WHERE id in (id1, id2 ...)。我知道这听起来很骇人听闻,但是由于查询非常复杂,我已经这样做了。第一个涉及许多几何和触发法,第二个涉及许多不同的联接。我确定它们可以在单个查询中编写,但是我的MYSQL不足以实现它。

这种方法有效,但是 感觉 不对。再加上我担心它不会扩展。目前,我正在10,000个记录的数据库上进行测试,并且在“ IN”子句(即IN (id1, id2 ... id400))中具有400个id,并且性能很好。但是,如果说有1,000,000条记录怎么办?

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


问题答案:

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

有关性能比较,请参阅我的博客中的这篇文章:

  • 在MySQL中传递参数:IN列表与临时表

如果在IN子句中查询中使用的列已建立索引,如下所示:

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

,则此查询仅被优化为一个EXISTS(对于的每个记录仅使用一个条目table1

不幸的是,MySQL它不能执行任务HASH SEMI JOINMERGE SEMI JOIN效率更高(特别是如果两个列都已索引)。



 类似资料:
  • 问题内容: 我想知道以下两个方面在性能方面是否有差异 还是MySQL将以与编译器优化代码相同的方式优化SQL? 编辑:改变了‘s到的在注释中规定的原因。 问题答案: 我确实需要知道这一点,因此我对这两种方法进行了基准测试。我始终发现它比使用快得多。 不要相信给出意见的人,科学就是测试和证据。 我运行了1000倍等效查询的循环(出于一致性考虑,我使用): :2.34969592094s :5.837

  • MySQL 中的 IN 运算符用来判断表达式的值是否位于给出的列表中;如果是,返回值为 1,否则返回值为 0。 NOT IN 的作用和 IN 恰好相反,NOT IN 用来判断表达式的值是否不存在于给出的列表中;如果不是,返回值为 1,否则返回值为 0。 IN 和 NOT IN 的语法格式如下: expr IN ( value1, value2, value3 ... valueN ) expr N

  • 问题内容: 我最近一直在尝试使用Redis和MongoDB,似乎经常会在MongoDB或Redis中存储 ID 数组。因为我要询问MySQL IN 运算符,所以我会坚持使用Redis 。 我想知道在IN运算符中列出大量(300-3000) id的 性能如何,看起来像这样: 想象一下简单的 产品* 和 类别 表,您通常可以将它们结合在一起以从某个 类别中 获得 产品 。在上面的示例中,您可以看到在R

  • 我有一个查询,以获得用户的朋友的数据。我有三个表,一个是user表,第二个是user_friend表,它有user_id和friend_id(都是user表的外键),第三个表是feed表,它有user_id和feed内容。饲料可以给朋友看。我可以通过两种方式查询,要么通过join查询,要么通过使用子句查询(我可以通过graph数据库获取所有朋友的ID,我正在使用它进行网络连接)。 以下是两个查询:

  • 问题内容: 这个问题已经在这里有了答案 : 等于(=)和IN的性能差异(带一个文字值) (7个答案) 2年前关闭。 这是一个非常简单的问题,我假设答案是“没关系”,但无论如何我都必须问… 我有一个用PHP构建的通用sql语句: 假设进行了先期有效性检查(一个数组至少包含1个项目且所有数值都是),我应该改为执行以下操作吗? 还是检查的开销不值得在实际的sql语句中保存(如果有的话)? 问题答案: 两

  • 问题内容: 我有一个带有ID编号的PHP数组。这些号码已经订购。 现在,我想通过IN()方法获取我的结果,以获取所有ID。 但是,这些ID的排序应类似于IN方法。 例如: 应该给出如下结果: 有什么建议么?也许有一个功能可以做到这一点? 谢谢! 问题答案: 我认为您可能正在寻找函数FIELD-通常被认为是字符串函数,但它也适用于数字!