Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 限制0,1会加速主键上的选择吗?_Mysql_Query Optimization_Relational Database - Fatal编程技术网

Mysql 限制0,1会加速主键上的选择吗?

Mysql 限制0,1会加速主键上的选择吗?,mysql,query-optimization,relational-database,Mysql,Query Optimization,Relational Database,有人知道这两个查询之间是否存在速度差异(显然对于足够大的表而言): SELECT field FROM table WHERE primary_key = "a particular value" 或: 我应该注意,主键字段实际上是主键 现在LIMIT 0,1确实有助于查询查找其他匹配项。但我假设,当涉及主键时,由于主键的唯一性,它应该自动停止。所以我的猜测是,添加它不会有任何好处 以前有人见过这个吗?目前我没有足够大的数据集可供测试。我还假设相同的答案适用于任何设置为唯一的字段,因此在阅读H

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

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

我应该注意,
主键
字段实际上是主键

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


以前有人见过这个吗?目前我没有足够大的数据集可供测试。我还假设相同的答案适用于任何设置为
唯一的字段

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

  • id=1
  • 选择类型=简单
  • 表=表
  • 类型=常数
  • 可能的_键=主
  • 键=主
  • 键长度=767
  • ref=常数
  • 行数=1
  • 额外=
它将两个查询标识为
CONST
,链接将其定义为:

常数

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


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

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

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

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

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

从表中选择Primary\u keycoll=“value1”或field2='value1'顺序按field2限制0,1的Primary\u keycoll,field2
可能Primary\u keycoll是唯一的,但其他的可能不是,例如:field2,限制为1,允许mysql获取第一个并停止,否则,它将遍历整个指定的列或资源,以确保其他列无法完成查询

出于安全考虑,在查询结束时使用limit是一种很好的做法,它会阻止一些SQL注入技巧。只要你的限制器,是适当的消毒


限制0将很快返回一个空集。

您可能会发现此阅读内容很有帮助:特别是标题“解释连接类型”+1,感谢添加的信息:)-同时我知道限制对于更复杂(或非索引/非唯一)的查询总是有帮助的。既然问了这个问题,我就知道默认情况下唯一字段是如何自动限制的。。。我没有想到的是实现LIMIT作为一种针对SQL注入的辅助手段可能带来的好处。。。这是一个很好的观点。奖金信息:
限制0
将快速返回一个空集。这可用于检查查询的有效性。如果查询是有效的,你不会得到错误,如果它是无效的,你会得到错误的描述。可以用于大型数据集的语法检查。+1我认为您已经论证过了,如果可以的话,始终使用限制0,1是有意义的。。。如果要检查查询的有效性,请使用限制0。很好的观点。
SELECT field FROM table WHERE primary_key = "a particular value" LIMIT 0,1