【问题标题】:MYSQL query WHERE IN vs ORMYSQL 查询 WHERE IN 与 OR
【发布时间】:2012-12-07 12:11:06
【问题描述】:

我开发了一个使用 OR 查询的系统:

SELECT * FROM tableA 
JOIN tableB ON (idA = idB)
WHERE idA = 1 OR 
      idA = 2 OR 
      idA = 3 OR 
      idA = 4 OR 
      idA = 5 ...... OR 
      idA=100

与查询IN比较:

SELECT * 
FROM tableA JOIN tableB ON (idA = idB)
WHERE idA IN (1,2,3,4,5,......,100)

MYSQL 数据库中最好的查询是什么?

【问题讨论】:

  • @StanleyW。谢谢...我没有使用搜索功能
  • 对于这样的事情,除非你知道这个查询是你应用程序中的一个瓶颈,否则多个OR 子句的混乱逻辑是不值得的。 (即使它快一点。)
  • IN() 是一个语法快捷方式,它(在语法术语中)与一系列 OR 完全相同,即 id IN(1,2) 等于 ( id=1 OR id=2 )。在小范围内,您将很难找到两者之间的任何差异。在非常大规模的情况下,一长串 OR 的解释时间将处于劣势。

标签: mysql sql where-in


【解决方案1】:

使用 IN。

IN 将使用索引。

OR 将(afaik)不使用索引。

另外,这一点不可小觑,IN 版本:

  • 使用更少的代码
  • 更容易维护
  • 更容易理解

仅出于这些原因,我会准备牺牲一点性能来获得代码质量,但实际上你也获得了性能。

【讨论】:

  • 我知道这是几年后的事了,但是 OR 和 IN() 的使用都可以(并且确实)使用索引。与许多事情一样,一概而论是危险的。在语法术语中,IN() 只是一组 OR 的快捷方式。请参阅sqlfiddle.com/#!9/c824e2/1(3 个 IN 查询,3 个 OR 查询,所有 6 个都使用索引;已测试 varchar、日期和整数) MySQL 5.6
【解决方案2】:

在这种情况下,您应该通过 EXPLAIN 运行查询,以检查它如何处理您的数据。例如:

EXPLAIN SELECT * FROM tableA

JOIN tableB ON (idA = idB)

WHERE idA = 1 OR idA = 2 OR idA = 3 OR idA = 4 OR idA = 5 ...... OR idA=100

这将提供几个统计数据并显示它是否使用索引、顺序扫描等。从中您将能够确定最适合您的情况。

不过,一般来说,我会选择 IN。

以前的工作已经确定 IN 几乎总是更快:MYSQL OR vs IN performance

【讨论】:

  • 我使用 EXPLAIN 获得相同的输出,我使用 DESC 并获得显示查询时间的差异值,对于 OR(查询耗时 0.0082 秒)和 IN(查询耗时 0.0074 秒)
【解决方案3】:
SELECT * FROM tableA

JOIN tableB ON (idA = idB)

WHERE idA <= 100

【讨论】:

  • 嗯,我认为我的查询不是 idA 的序列,但 idA 是随机值,我只是创建简单的示例问题 :)
【解决方案4】:

永远不要使用 Or 如果你有 In 作为替代。

这会让你的查询超级慢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-13
    • 2015-09-17
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多