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
表达式更短(并且性能更好!)。
为什么这样更好?
- 从数据库返回到应用程序的数据较少。这是第一个原因。
- 如果索引可用,数据库可以使用索引来查找行。
- MySQL 通过布尔搜索用常量列表优化
IN
。
- 许多数据库(但 MySQL 除外)可以并行进行比较。
假设我们要从 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
表达式更短(并且性能更好!)。
为什么这样更好?
- 从数据库返回到应用程序的数据较少。这是第一个原因。
- 如果索引可用,数据库可以使用索引来查找行。
- MySQL 通过布尔搜索用常量列表优化
IN
。 - 许多数据库(但 MySQL 除外)可以并行进行比较。