有没有人知道这两个查询之间是否有任何速度差异(显然对于足够大的表格):
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
的任何字段。
答案 0 :(得分:8)
因此,在阅读了Hammerite提供的信息后(感谢您),在两个查询上运行explain
会产生:
将两个查询标识为CONST
,链接定义为:
<强>常量强>
该表最多有一个匹配的行,在行的开头读取 查询。因为只有一行,所以列中的值 优化器的其余部分可以将此行视为常量。 const表非常快,因为它们只读一次。
因此,假设我正确地理解了两个查询,它们将被视为相同 - 这正是我所期望的。
答案 1 :(得分:4)
主键将作为索引进行搜索,速度非常快。
但是限制查询是最佳做法的一部分。
对于任何更复杂的查询,它将使用Joins,Group_by和order by by甚至单次搜索,它允许sql在找到你的限制记录row_count之后停止,例如:1
如果你要使用order by,它将允许sql从ordered 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获取第一个并停止,否则它将通过整个指定的列或资源来确保其他列不满足查询。
出于安全原因,在查询结束时使用limit是一种很好的做法,它会阻止一些SQL注入技巧。只要你的限制器,正确消毒。
http://dev.mysql.com/doc/refman/5.0/en/limit-optimization.html