MYSQL 查询 WHERE IN 与 OR

Posted

技术标签:

【中文标题】MYSQL 查询 WHERE IN 与 OR【英文标题】:MYSQL query WHERE IN vs 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 数据库中最好的查询是什么?

【问题讨论】:

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

这会让你的查询超级慢

【讨论】:

以上是关于MYSQL 查询 WHERE IN 与 OR的主要内容,如果未能解决你的问题,请参考以下文章

mysql主表查询的where 条件怎么写查询另一个表的数据?

mysql中on,in,as,where如何用,意思是啥?

7_mysql查询之where子句

MySQL 子查询优化 - where not in(子查询)

MySQL 查询优化:IN() 与 OR

准备好的语句,`WHERE .. IN(..)` 查询和排序 - 使用 MySQL