【问题标题】:SQL Performance: comparing n valuesSQL 性能:比较 n 个值
【发布时间】:2018-03-10 17:41:42
【问题描述】:

假设我们要从表中检索n 元素(类型为string/varchar(64))。

我们假设 0 n

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

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)

【问题讨论】:

  • 如果您在last_name 上有索引,那肯定会更快。无需返回表中的所有内容,然后在另一段代码中迭代该结果。此外,您应该查看IN (),而不是列出所有OR 语句。
  • 根据我的经验,我可以说,如果它在数据库中,几乎所有东西都比处理从数据库加载的数据要快。
  • 非常感谢,我不确定是否要比较查询的WHERE 部分中的所有这些值!
  • 你能用IN吗,如果你只用SQL就能做到,那总是最好最快的。您的值是在内存中还是在另一个表中? RDBS 引擎擅长思考集合理论和 IN ;)

标签: mysql sql database performance database-performance


【解决方案1】:

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

代码应该写成:

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)可以并行进行比较。

【讨论】:

  • #2:它可能使用索引。或者它可能决定扫描该功能更快。 #3:什么是“布尔搜索”?也许您的意思是“二进制搜索”?如果是这样,它将在IN 列表中,而不是在表中。
猜你喜欢
  • 1970-01-01
  • 2012-05-14
  • 2011-07-12
  • 2010-12-04
  • 1970-01-01
  • 2017-11-17
  • 2015-07-31
  • 1970-01-01
  • 2021-12-03
相关资源
最近更新 更多