在处理大型数据库时,SQL Where子句中的INOR哪个性能更好?

他们的执行方式有什么不同吗?

推荐答案

我假设您想知道以下各项之间的性能差异:

WHERE foo IN ('a', 'b', 'c')
WHERE foo = 'a' OR foo = 'b' OR foo = 'c'

根据manual for MySQL,如果值是常数,则IN对列表进行排序,然后使用二进制搜索.我可以想象OR会一个接一个地判断它们,没有特定的顺序.所以在某些情况下IN更快.

最好的了解方法是使用特定数据在数据库中分析这两种方法,以查看哪种方法更快.

我在一个有1000000行的MySQL上try 了这两种方法.当列被编入索引时,性能没有明显的差异——两者几乎都是即时的.当该列没有索引时,我得到了以下结果:

SELECT COUNT(*) FROM t_inner WHERE val IN (1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000);
1 row fetched in 0.0032 (1.2679 seconds)

SELECT COUNT(*) FROM t_inner WHERE val = 1000 OR val = 2000 OR val = 3000 OR val = 4000 OR val = 5000 OR val = 6000 OR val = 7000 OR val = 8000 OR val = 9000;
1 row fetched in 0.0026 (1.7385 seconds)

所以在这种情况下,使用OR的方法要慢30%.增加更多术语会使差异更大.结果可能因其他数据库和其他数据而异.

Sql相关问答推荐

JSON列之间的Postgr聚合

用于匹配红旗和绿旗的SQL查询

R中对Arrow duckdb工作流的SQL查询

OVER子句WITH PARTITION BY和ORDER BY忽略主查询的WHERE子句

来自按PostgreSQL分组的最小日期

Oracle 23c ROUND,数据类型为DATE

用于SQL协助的XQUERY()

统计PostgreSQL中前10个最大大小表的行数

Athena 计算从日期到当前时间戳的每月计数

获取主表条目,其中最新的辅助条目是 6 个月前

对现有记录进行分组

日期逻辑(查找过go 90 天内的第一个匹配行)

具有分组条件的不同计数 (DAX)

计算组内多个日期间隔go 年的累计天数

按所选的值将记录分组到不同的列中

带聚合函数的 percentile_cont

雅典娜弄错了操作顺序

Oracle SQL 从多个条件中 Select 但具有相同的 id

SQL日期比较用例;月初至今的报告

PostgreSQL 中的递归树查询