【问题标题】:Does using "LIMIT 1" speed up a query on a primary key?使用“LIMIT 1”会加快对主键的查询吗?
【发布时间】:2012-01-18 00:29:37
【问题描述】:

如果我有一个主键 id 并且我对键进行简单查询,例如,

SELECT id FROM myTable WHERE id = X

它会找到一行然后停止查找,因为它是主键,还是告诉 mysql 使用LIMIT 1 限制其选择会更好?例如:

SELECT id FROM myTable WHERE id = X LIMIT 1

【问题讨论】:

  • 我该如何尝试??它总是只返回 1 行,我想知道它是否在找到主键后停止进行全表扫描!
  • @cgweb87:请确认我对您问题的编辑使其更清晰,而不是偏离您的意图。

标签: mysql sql


【解决方案1】:

使用“LIMIT 1”会加快对主键的查询吗?

没有。没有LIMIT 1,它已经尽可能快了。 LIMIT 1 无论如何都被有效地暗示了。

它会找到一行然后停止查找,因为它是主键

是的。

这里根本不需要表扫描:它是基于键的查找。找到匹配的行,这就是过程的结束。

【讨论】:

  • 使用“LIMIT 1”会加快对主键的查询吗?是或否。您的回答是“否”,但说“是”。
  • @TarranJones:我不明白你为什么认为它暗示“不”。
  • 我假设基于键的查找将是“SELECT primary_key_id FROM myTable WHERE primary_key_id = X”。 (没有“限制1”)正确吗?因此,如果使用基于键的查找意味着该过程一旦找到匹配的行就结束。那么答案是否定的。添加限制 1 不会加快对主键的查询。
  • @TarranJones:嗯,是的。看起来我当时错过了这个问题的一些因素。
  • @cgweb87:你不应该接受这个答案;这是不对的。
【解决方案2】:

无需担心这种“优化”。

将只获取一行——每个唯一索引合约——并且数据库能够非常快速地找到所有 (1) 行。它之所以能够做到这一点,是因为支持索引(或主键)的底层结构支持按值快速查找。不涉及表扫描。 (通常使用 B 树的变体,但它可能是基于哈希的,等等。我想智能查询优化器也可能能够根据有效的唯一约束传递额外的提示,但我没有对此知之甚少。)

【讨论】:

  • 谢谢,我的数据库有超过 500,000 行的唯一键,我只是想尝试一下以提高性能。
  • @cgweb87 您可以随时运行测试。我怀疑“没有变化”,但是如果您发现明显的差异,那么 1)利润 2)写后续 SO 问题 3)更多利润 :)
  • @cgweb87 不要忘记分析查询计划,以及测量挂钟时间。
  • 我知道一个数据库允许您在 B-tree 或基于哈希的主键之间进行选择,尽管这确实意味着您必须在允许将数据插入到表。
  • @Neil 我还没有使用不将其用作主键的数据库——因为对主键的要求之一是唯一性,否则这样做似乎很愚蠢。虽然,我没有使用很多数据库:)
猜你喜欢
  • 1970-01-01
  • 2012-03-07
  • 1970-01-01
  • 2012-01-23
  • 1970-01-01
  • 2019-05-27
  • 2012-06-08
  • 2013-03-05
  • 2019-06-26
相关资源
最近更新 更多