LIMIT 0,1 会加速主键上的 SELECT 吗?

Posted

技术标签:

【中文标题】LIMIT 0,1 会加速主键上的 SELECT 吗?【英文标题】:Would LIMIT 0,1 speed up a SELECT on a Primary Key? 【发布时间】:2012-07-04 11:15:46 【问题描述】:

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

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 的任何字段。

【问题讨论】:

您可能会发现此阅读很有帮助:dev.mysql.com/doc/refman/5.0/en/… 特别是标题“解释连接类型” 【参考方案1】:

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

id = 1 select_type = 简单 表 = 表 类型 = 常量 possible_keys = PRIMARY 键 = 主要 key_len = 767 ref = 常量 行 = 1 额外 =

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

常量

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

所以假设我正确理解了这两个查询,它们将被同等对待 - 这是我所期望的。

【讨论】:

【参考方案2】:

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

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

在任何更复杂的查询中,通过 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 将快速返回一个空集。

【讨论】:

+1 感谢您提供的信息 :) - 虽然我知道 LIMIT 将始终帮助处理更复杂(或非索引/非唯一)的查询。现在,自从问了这个问题后,我知道默认情况下,唯一字段基本上是如何自动限制的......我没有想到的是实施 LIMIT 作为对 SQL 注入的帮助的可能好处......那就是一个好点。 奖励信息:LIMIT 0 会很快返回一个空集。这可用于检查查询的有效性。如果查询有效,您将不会收到错误,如果查询无效,您将获得错误描述。可用于大数据集的语法检查。 +1 我认为您已经论证过,如果可以的话,总是使用 LIMIT 0,1 是有意义的......如果您希望检查查询的有效性,则使用 LIMIT 0 是有意义的。好点。

以上是关于LIMIT 0,1 会加速主键上的 SELECT 吗?的主要内容,如果未能解决你的问题,请参考以下文章

同一主键上的EF多个外键关系

外键 VS 主键上的聚集索引

复合主键上的慢连接

主键上的非聚集索引?

首先使用代码禁用整数主键上的标识(自动递增)

使用主键和排序键上的两个条件查询表