将查询限制为一条记录可以提高性能

时间:2008-08-29 15:48:23

标签: sql mysql database

如果表只有一个匹配的结果,会将查询限制为一个结果记录,提高大型(ish)MySQL表的性能吗?

例如

 select * from people where name = "Re0sless" limit 1

如果只有一个具有该名称的记录?如果name是主键/设置为唯一,那该怎么办?是否值得更新查询或者收益是否最小?

6 个答案:

答案 0 :(得分:39)

如果列有

一个独特的索引:不,它没有更快

非唯一索引:可能,因为它会阻止发送超出第一个匹配的任何其他行(如果存在)

没有索引:有时

  • 如果一行或多行与查询匹配,,因为匹配第一行后将停止全表扫描。
  • 如果没有与查询匹配的行,因为它需要完成全表扫描

答案 1 :(得分:4)

如果您有一个稍微复杂一点的查询,并且有一个或多个连接,LIMIT子句会为优化器提供额外的信息。如果它希望匹配两个表并返回所有行,则hash join通常是最佳的。散列连接是一种针对大量匹配而优化的连接类型。

现在,如果优化器知道您已通过LIMIT 1,它就知道它不会处理大量数据。它可以恢复为loop join

基于数据库(甚至是数据库版本),这会对性能产生巨大影响。

答案 2 :(得分:2)

按顺序回答您的问题:  1)是的,如果名称上没有索引。查询将在找到第一条记录后立即结束。取消限制,每次都必须进行全表扫描。  2)没有。主要/唯一密钥保证是唯一的。查询应该在找到行后立即停止运行。

答案 3 :(得分:0)

我相信LIMIT是在找到数据集并且结果集正在建立之后完成的,所以我不希望它会产生任何差别。将名称作为主键将产生显着的积极效果,因为它将导致为列创建索引。

答案 4 :(得分:0)

如果“name”在表中是唯一的,那么通过在查询中加上限制约束,可能仍然会有(非常非常小的)性能增益。如果name是主键,则可能没有。

答案 5 :(得分:0)

是的,在处理数据时,您会注意到性能差异。一条记录占用的空间少于多条记录。除非您处理许多行,否则这不会有太大区别,但是一旦您运行查询,数据必须显示给您,这是昂贵的,或以编程方式处理。无论哪种方式,一条记录比多条记录更容易。