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
会产生:
将两个查询标识为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 吗?的主要内容,如果未能解决你的问题,请参考以下文章