SQL 性能:比较 n 个值

SQL Performance: comparing n values

假设我们要从 table.

中检索 n 个元素(类型 string/varchar(64)

我们假设 0 <= n < 1000。

这两个中哪一个最快并且需要的资源更少?

SELECT id, last_name 
FROM Users 
WHERE last_name="a" 
OR last_name="b" 
OR last_name="c" 
OR last_name="d"....

SELECT id, first_name, last_name 
FROM mytable

然后是对输出进行过滤的代码处理,例如简单的 Python:

result = []
for last_name in output:
    if last_name in POSSIBLE_NAMES:
        result.append(last_name)

第一个应该是最快的。在数据库中过滤 是最好的方法——我想不出任何例外情况。

代码应该写成:

SELECT id, last_name
FROM Users
WHERE last_name IN ('a', 'b', 'c', 'd', . . . );

(如果您也想要 first_name,请将其放入 SELECT。)

单引号是字符串常量的 ANSI 标准,IN 比一堆 OR 表达式更短(并且性能更好!)。

为什么这样更好?

  1. 从数据库返回到应用程序的数据较少。这是第一个原因。
  2. 如果索引可用,数据库可以使用索引来查找行。
  3. MySQL 通过布尔搜索用常量列表优化 IN
  4. 许多数据库(但 MySQL 除外)可以并行进行比较。