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

时间:2020-03-05 18:44:59  来源:igfitidea点击:

如果一个查询只有一个结果记录,将查询限制在一个结果记录中,会提高性能吗?

例如

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

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

解决方案

回答

我相信LIMIT是在找到数据集并建立结果集之后完成的,所以我完全不希望它有任何不同。尽管将名称设为主键将产生显着的积极效果,但它将导致为该列创建索引。

回答

如果列有

唯一索引:不,没有更快

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

无索引:有时

  • 如果有1个或者更多行与查询匹配,则是,因为在匹配第一行后将停止全表扫描。
  • 如果没有行与查询匹配,则否,因为它将需要完成全表扫描

回答

如果"名称"在表中是唯一的,则通过在查询中放置限制约束,可能仍会(非常非常小)提高性能。如果名称是主键,则可能没有。

回答

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

回答

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

回答

如果查询稍微复杂一些,并且具有一个或者多个联接,则LIMIT子句为优化器提供了更多信息。如果期望匹配两个表并返回所有行,则通常最好使用散列连接。哈希联接是为大量匹配而优化的联接类型。

现在,如果优化器知道我们已通过LIMIT 1,它将知道它不会处理大量数据。它可以还原为循环联接。

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