看一遍就理解:group by详解
2022-07-21 11:07:16
平素开荒中,咱们往往会运用到 group by 。敬爱的小伙伴,你是否真切 group by 的做事道理呢? group by 和 having 有什么区别呢? group by 的优化思绪是若何的呢?运用 group by 有哪些须要防卫的题目呢?本文将跟群众一道来研习,攻陷 group by ~
group by 日常用于分组统计,它外达的逻辑便是 依据肯定的端正,举办分组 。咱们先从一个大略的例子,一道来温习一下哈。
便是把须要排序的字段,放到sort buffer,排完就返回。正在这里防卫一点哈,排序分全字段排序和rowid排序
即使是 全字段排序 ,须要盘问返回的字段,都放入 sort buffer ,依据排序字段排完,直接返回
即使是 rowid排序 ,只是须要排序的字段放入 sort buffer ,然后众一次回外操作,再返回。
何如确定走的是全字段排序依然rowid 排序排序呢?由一个数据库参数驾驭的, max_length_for_sort_data
有些小伙伴感触上一末节的SQL太大略啦,即使加了where要求之后,而且where要求列加了索引呢,践诺流程是若何?
从explain 践诺安置结果,可能发觉盘问要求掷中了 idx_age 的索引,而且运用了 一时外和排序
Using index condition:外现索引下推优化,依据索引尽恐怕的过滤数据,然后再返回给办事器层依据where其他要求举办过滤。这里单个索引为什么会产生索引下推呢?explain产生并不代外肯定是运用了索引下推,只是代外可能运用,然则不肯定用了。群众即使有思法或者有疑义,可能加我微信商榷哈。
即使你要盘问每个都市的员工数目,获取到员工数目不低于3的都市,having可能很好管理你的题目,SQL酱紫写:
当然,泛泛群众运用的期间,group by依然配合纠合函数运用的,除非极少特地场景,好比你思去重,当然去重用 distinct 也是可能的。
分组字段 city 不正在select 后面,并不会报错。当然,这个恐怕跟差别的数据库,差别的版本相闭吧。群众运用的期间,可能先验证一下就好。有一句话叫做,纸上得来终觉浅,绝知此事要躬行。
到了最要紧的一个防卫题目啦, group by 运用不妥,很容易就会爆发慢SQL 题目。由于它既用到一时外,又默认用到排序。有期间还恐怕用到磁盘一时外。
即使践诺进程中,会发觉内存一时外巨细达到了上限(驾驭这个上限的参数便是 tmp_table_size ),会把内存一时外转成磁盘一时外。
咱们一道来思下,践诺 group by 语句为什么须要一时外呢? group by 的语义逻辑,便是统计差别的值产生的个数。即使这个这些值一开首便是有序的,咱们是不是直接往下扫描统计就好了,就不必一时外来记实并统计结果啦?
即使 group by 须要统计的数据不众,咱们可能尽量只运用内存一时外;由于即使group by 的进程由于内存一时外放不下数据,从而用到磁盘一时外的话,是较量耗时的。于是可能合适调大 tmp_table_size 参数,来避免用到磁盘一时外。
即使数据量实正在太大何如办呢?总不行无穷调大 tmp_table_size 吧?但也不行眼睁睁看着数据先放到内存一时外,跟着数据插入发觉达到上限,再转成磁盘一时外吧?如此就有点不智能啦。
于是,即使预估数据量较量大,咱们运用 SQL_BIG_RESULT 这个提示直接用磁盘一时外。MySQl优化器发觉,磁盘一时外是B+树存储,存储功效不如数组来得高。于是会直接用数组来存
咱们先不去研讨这个SQL的=是否合理。即使便是这么个SQL,你会何如优化呢?有思法的小伙伴可能留言商榷哈,也可能加我微信加群研讨。即使你感触作品那里写得错误,也可能提出来哈,一道进取,加油呀