【问题标题】:Is it necessary to use 'Limit 1' for 'SQL SELECT' for performance?是否有必要对“SQL SELECT”使用“限制 1”以提高性能?
【发布时间】:2015-02-10 03:40:27
【问题描述】:

例如,我有一个表 (users),它的列是 name

案例 1:

我知道所有“名称”的值都是不同的(唯一的)但我没有使用此列的“主键”

案例 2:

我知道所有“名称”的值都是不同的(唯一的)并且我在此列中使用了“主键”


如果我将这两个查询用于“案例 1”和“案例 2”

1. SELECT * FROM `users` WHERE `name` = 'Obama'

2. SELECT * FROM `users` WHERE `name` = 'Obama' LIMIT 1

Case 1Case 2 的性能差异是多少?

【问题讨论】:

标签: mysql sql performance


【解决方案1】:

选择 1 个结果总是比选择所有结果更快,无论是否被索引,因为 LIMIT 1 在第一个匹配后停止(想想你有数百万个匹配的情况。但即使只有 2 个匹配,它也更快发回 1 个结果而不是 2 个。)

在列上建立索引通常(但并非总是)比没有索引更快,因为有了索引,可以在 O(log n) 时间内找到数学行,而没有索引则需要线性扫描和 O(n) 时间。例外情况是当大多数行匹配时,简单(且快速)的线性扫描可以在比索引 + 主表读取上的二进制搜索开销更短的时间内找到匹配项。

编辑:如果为存在测试运行查询,是的,绝对是 LIMIT 1。计算一百万条记录的结果集只是为了检查它是否为空,这将是缓慢和浪费的。 (还有一个 mysql EXISTS 关键字非常相似,语法略有不同)

【讨论】:

  • 'LIMIT 1 stop after the first match' 和 ''如果查询是针对存在性测试运行的,是的,绝对是 LIMIT 1" 这句话正是我想听到的。
  • 如果为存在性测试运行查询,则使用EXISTS ( SELECT * ... ) 没有 LIMIT——“半连接”有额外的优化。
  • 如果您知道最多只有一行,请不要费心使用 LIMIT 1。任何想象中的节省都是微不足道的。拥有该子句意味着您认为可能不止一行。
猜你喜欢
  • 1970-01-01
  • 2016-04-19
  • 2016-01-08
  • 1970-01-01
  • 1970-01-01
  • 2018-09-06
  • 1970-01-01
  • 2020-12-27
  • 1970-01-01
相关资源
最近更新 更多