使用 LIMIT 是否可以提高性能,是否显着?

Jim*_*Jim 14 mysql performance join

我想了解以下内容。
假设我有一个复杂的查询,假设通过求和和排序将一组 5 个表连接起来。
抛开对查询本身的任何优化,例如索引等。
使用LIMIT?是否有任何显着的性能优势?我假设应用 LIMIT之前必须处理所有查询(和结果),因此使用 LIMIT 来检索结果的子集,这是否提供了任何显着/显着的改进?

Rol*_*DBA 13

如果你想利用LIMIT来提高性能,你需要

  • 了解您正在检索的数据
  • 正确索引正确的列顺序
  • 负责重构查询
  • LIMIT之前使用JOIN

如果您可以精心安排这些原则,它们将大有帮助。

我通过观看这个 YouTube 视频学习了这些概念(仔细听法语口音)

我使用这些概念来回答一个关于从某些表中获取前 40 篇文章的非常棘手的 StackOverflow 问题:2011 年 5 月 12 日:从连接表中获取单行

我对该问题的回答(2011 年 5 月 16 日)中,我编写了以下查询并对其进行了彻底的测试:

SELECT
  AAA.author_id,
  AAA.date_created,
  IFNULL(BBB.title,'<NO_TITLE>') title,
  IFNULL(CCC.filename,'<NO-IMAGE>') filename,
  IFNULL(CCC.date_added,'<NO-IMAGE-DATE>') image_date
FROM
(
  SELECT
    AA.id,
    AA.date_added,
    BB.author_id,
    BB.date_created
  FROM
  (
    SELECT
      A.id,IFNULL(MAX(B.date_added),'1900-01-01 00:00:00') date_added
      FROM (SELECT id FROM articles ORDER BY date_created DESC LIMIT 40) A
      LEFT JOIN article_images B ON A.id = B.article_id
      GROUP BY A.id
  ) AA
  INNER JOIN articles BB USING (id)
) AAA
LEFT JOIN article_contents BBB ON AAA.id=BBB.article_id
LEFT JOIN article_images CCC
ON (AAA.id=CCC.article_id AND AAA.date_added=CCC.date_added)
ORDER BY AAA.date_created DESC;
Run Code Online (Sandbox Code Playgroud)

请注意查询中的行 LIMIT

      FROM (SELECT id FROM articles ORDER BY date_created DESC LIMIT 40) A
Run Code Online (Sandbox Code Playgroud)

这个子查询深埋三层。这使我能够使用LIMIT. 然后,我之后执行了必要的 JOIN。

得到教训

  • 否则LIMIT里面的子查询不一定是因为指数的基数,数据内容,并从结果集大小的答案LIMIT。如果您拥有所有“连续的鸭子”(记住查询的四个原则),您可以获得令人惊讶的好结果。
  • LIMIT仅通过收集键来使您的查询尽可能简单。


Seb*_*ine 2

当执行查询时,它首先被转换为由多个运算符组成的计划。有两种基本类型的运算符:阻塞和非阻塞。非阻塞运算符从其子级或子级中检索一行(或几行),以获取从其请求的每一行。另一方面,阻塞运算符必须读入并处理其所有子级的整个行集,然后才能产生任何输出。

排序是典型的阻塞运算符。因此,带有 order by 的 select 不会从限制中获益太多。然而,有些 RDBMS 可以利用需要更少内存的排序算法,并且在提供限制子句时速度更快。在这种情况下,只需存储当前的前 n 行并在较早的行出现时将它们移出内存即可。这可能会带来显着的性能提升。然而,我并不能100%确定MySQL有这个能力。

无论哪种方式,即使是限制排序仍然需要处理整个输入行集,然后才能生成第一个输出行。虽然此算法如果实现,可以加快排序速度,但如果查询的其余部分是最昂贵的部分,则由于提供的限制,总执行时间不会显着改善。