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
仅通过收集键来使您的查询尽可能简单。当执行查询时,它首先被转换为由多个运算符组成的计划。有两种基本类型的运算符:阻塞和非阻塞。非阻塞运算符从其子级或子级中检索一行(或几行),以获取从其请求的每一行。另一方面,阻塞运算符必须读入并处理其所有子级的整个行集,然后才能产生任何输出。
排序是典型的阻塞运算符。因此,带有 order by 的 select 不会从限制中获益太多。然而,有些 RDBMS 可以利用需要更少内存的排序算法,并且在提供限制子句时速度更快。在这种情况下,只需存储当前的前 n 行并在较早的行出现时将它们移出内存即可。这可能会带来显着的性能提升。然而,我并不能100%确定MySQL有这个能力。
无论哪种方式,即使是限制排序仍然需要处理整个输入行集,然后才能生成第一个输出行。虽然此算法如果实现,可以加快排序速度,但如果查询的其余部分是最昂贵的部分,则由于提供的限制,总执行时间不会显着改善。
归档时间: |
|
查看次数: |
23754 次 |
最近记录: |