6

有谁知道这两个查询之间是否存在任何速度差异(显然对于足够大的表) :

SELECT field FROM table WHERE primary_key = "a particular value"

或者:

SELECT field FROM table WHERE primary_key = "a particular value" LIMIT 0,1

我应该注意,该primary_key字段实际上是一个主键。

LIMIT 0,1当查询将继续查找其他匹配项时,现在确实有帮助。我假设当涉及主键时,由于它的唯一性,它应该自动停止。所以我的猜测是添加它不会有任何收益。

有人遇到过这个吗?目前我没有足够大的数据集进行测试。我还假设相同的答案将适用于已设置为的任何字段UNIQUE

4

2 回答 2

8

explain因此,在阅读了在两个查询上运行的 Hammerite(谢谢)提供的信息后,会产生:

  • 编号 = 1
  • 选择类型 = 简单
  • 表 = 表
  • 类型 = 常量
  • 可能的键=主要
  • 关键=主要
  • key_len = 767
  • 参考 = 常量
  • 行 = 1
  • 额外=

它将两个查询标识为CONST,链接定义为:

常量

该表最多有一个匹配行,在查询开始时读取。因为只有一行,所以该行中列的值可以被优化器的其余部分视为常量。const 表非常快,因为它们只被读取一次。

因此,假设我正确理解了这两个查询,它们将被视为相同 - 这是我所期望的。

于 2012-07-04T11:49:14.763 回答
4

主键将作为索引进行搜索,速度非常快。

但是限制查询是最佳实践的一部分。

在任何更复杂的查询中,使用 Joins、Group_by 和 order by 甚至单个搜索,它允许 sql 在找到限制记录 row_count 后停止,例如:1

如果您使用 order by,它将允许 sql 从 order by 列适当地开始搜索并在找到 1 条记录后停止,即使在其他指定的列或条件中找到其他记录,例如:

SELECT Primary_keycoll,field2 FROM table WHERE Primary_keycoll = "value1" or field2 = 'value1' order by field2 limit 0,1也许 Primary_keycoll 是唯一的,但其他例如: field2 可能不是,限制为 1 ,允许 mysql 获取第一个并停止,否则它将遍历整个指定的列或资源以确保其他列不满足查询。

出于安全原因,在查询末尾使用限制是一种很好的做法,它会阻止一些 SQL 注入技巧。只要您的限制器经过适当的消毒。

http://dev.mysql.com/doc/refman/5.0/en/limit-optimization.html

LIMIT 0 将快速返回一个空集。

于 2012-10-06T20:56:29.480 回答