32

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

例如

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

如果只有一个具有该名称的记录?如果name主键/设置为唯一呢?是否值得更新查询或者收益会很小?

4

6 回答 6

43

如果该列有

唯一索引:不,它没有更快

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

无索引:有时

  • 如果有 1 行或更多行匹配查询,则yes,因为在匹配第一行后将停止全表扫描。
  • 如果没有行匹配查询,,因为它需要完成全表扫描
于 2008-08-29T15:51:55.847 回答
4

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

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

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

于 2009-03-29T18:33:52.347 回答
2

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

于 2008-08-29T15:55:07.460 回答
0

我相信 LIMIT 是在找到数据集并且正在构建结果集之后完成的,所以我不希望它有任何区别。将 name 设为主键将产生显着的积极影响,因为它会导致为列创建索引。

于 2008-08-29T15:51:53.130 回答
0

如果“名称”在表中是唯一的,那么通过对查询设置限制约束,可能仍然会有(非常非常小的)性能提升。如果 name 是主键,则可能没有。

于 2008-08-29T15:52:42.817 回答
0

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

于 2009-03-29T18:22:37.787 回答