欢迎来真孝善网,为您提供真孝善正能量书籍故事!

MySQL 性能优化(八):GROUP BY与DISTINCT查询优化技巧

时间:11-22 神话故事 提交错误

大家好,关于MySQL 性能优化(八):GROUP BY与DISTINCT查询优化技巧很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!

当无法使用索引时,MySQL有两种GROUP BY查询策略:使用临时表或文件排序进行分组。对于给定的查询,这两种方法都没有更有效。我们可以通过配置SQL_BIG_RESULT和SQL_SMALL_RESULT来指定优化器选择其中一种方法。

通常,在查询表中按ID 分组比按值分组更有效。例如,以下查询效率较低:

SELECT actor.first_name, actor.last_name, COUNT(*)

来自sakila.file_actor

内连接sakila.actor USING(actor_id)

按演员.名字、演员.姓氏分组;下面的查询更有效:

SELECT actor.first_name, actor.last_name, COUNT(*)

来自sakila.file_actor

内连接sakila.actor USING(actor_id)

按film_actor.actor_id 分组;并且使用actor.actor_id进行分组比film_actor.actor_id更高效。

此查询发挥其优势的原因是演员的名称取决于actor_id,因此将返回相同的结果,但如果返回的结果不同,则这是不可能的。有时服务器甚至通过SQL_MODE 配置禁用GROUP BY。这时,如果你不关心获取的值,并且用于分组的列的值是唯一的,则可以使用MIN和MAX来解决这个问题。

SELECT MIN(演员.名字), MAX(演员.姓氏),对于完美主义者来说,他们会认为你的分组是错误的,他们也是对的。虚拟MIN 或MAX 的结果是查询将无法正确组装。然而,有时您只是希望MySQL 更快地执行查询。完美主义者会对以下查询感到满意:

SELECT actor.fisrt_name、actor.last_name、c.cnt

来自sakila.演员

内连接(

选择actor_id, COUNT(*) AS cnt

来自sakila.film_actor

按actor_id 分组

) AS c USING(actor_id);然而,在子查询中创建和填充临时表的成本可能比理论上看起来要高。需要记住的是,子查询构建的临时表没有索引,这会导致性能下降。

通常在分组查询中,选择不分组的列是一个坏主意。这是因为查询结果是不确定的。一旦索引改变或者优化器使用不同的策略,结果就会改变。事实上,我们建议将服务器端SQL_MODE设置为ONLY_FULL_GROUP_BY,这样当编写分组不佳的查询时,系统将生成错误而不是直接执行。 ONLY_FULL_GROUP_BY开启后,SELECT的字段只能是GROUP BY指定的字段。这时,可以构建分步查询或者子查询,先找出分组的列,然后再进行二次查询。

MySQL会自动按照GROUP BY指定的列顺序进行分组,除非使用ORDER BY指定的排序规则。如果您不关心排序并发现这会导致文件排序,则可以使用ORDER BY NULL 跳过自动排序。还可以通过在GROUP BY后面添加DESC或ASC来指定结果按指定方向排序。

有时你可以要求MySQL在执行组查询时对结果进行超级聚合。这可以通过在GROUP BY之后添加WITH ROLLUP子句来完成,但这不一定能达到优化预期。可以通过EXPLAIN查看执行方式,注意分组是通过filesort还是临时表完成的。然后在删除WITH ROLLUP 后比较相同的查询。通过比较可以找到优化方法。

有时添加聚合查询会更有效,尽管这种方式会返回更多行。还可以通过在FROM后面嵌套子查询来保留中间查询结果,然后使用UNION得到最终结果。

但注意,最好在应用程序中去掉WITH ROLLUP,通过优化完成分组查询。

用户评论

Edinburgh°南空

终于看到了关于GROUP BY和DISTINCT优化的文章!之前一直很困惑这些查询怎么那么慢。

    有9位网友表示赞同!

早不爱了

我经常用GROUP BY分组统计数据,希望能知道一些提升效率的小技巧。

    有19位网友表示赞同!

太易動情也是罪名

学习一下优化GROUP BY查询,说不定能加快项目的处理速度。

    有19位网友表示赞同!

你tm的滚

DISTINCT语句有时候会让我抓狂,不知道怎么才能让它更快一点。

    有16位网友表示赞同!

心贝

MySQL的优化技巧真是太重要了,尤其对于频繁查询的数据表来说。

    有9位网友表示赞同!

限量版女汉子

这篇文章刚好可以解决我最近遇到的一个数据库性能问题。

    有10位网友表示赞同!

微信名字

分享一下你学到的MySQL 查询优化方法吧,很期待能提高我的开发效率。

    有7位网友表示赞同!

呆萌

看了标题就感觉很有用,应该好好学习下GROUP BY和DISTINCT的优化技巧。

    有11位网友表示赞同!

窒息

平时很少关注这些细节,也许是时候提升自己的数据库技能了。

    有18位网友表示赞同!

从此我爱的人都像你

我经常需要进行数据分析,优化查询速度对我来说非常关键。

    有19位网友表示赞同!

若他只爱我。

MySQL的性能优化是一个永恒的话题,任何一点提升都值得学习。

    有17位网友表示赞同!

怪咖

感觉这篇文章应该很详细,能解决很多关于GROUP BY和DISTINCT的常见问题。

    有9位网友表示赞同!

迷路的男人

期待作者分享一些具体的代码示例和实践经验。

    有18位网友表示赞同!

不忘初心

之前也遇到了GROUP BY查询慢的问题,希望能从这篇文章中找到解决方案。

    有7位网友表示赞同!

折木

学习一下优化技巧,让数据库跑得更快更高效一点。

    有17位网友表示赞同!

肆忌

希望这篇文章能教会我如何用更聪明的方法进行数据查询。

    有8位网友表示赞同!

剑已封鞘

提高MySQL的性能是很多开发者都会面临的挑战,这篇帖子很有帮助。

    有11位网友表示赞同!

青楼买醉

以前对GROUP BY和DISTINCT的理解不够深入,这篇文章或许可以弥补这一缺陷。

    有18位网友表示赞同!

烟雨萌萌

相信学习了这些优化技巧,我的数据库应用会更加流畅高效。

    有15位网友表示赞同!

【MySQL 性能优化(八):GROUP BY与DISTINCT查询优化技巧】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活