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 条件怎么写查询另一个表的数据?