IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

标签:group by

共 4 篇相关文章

IT 累计浏览 2,312

MySQL 中group by的实现

这篇讲的是 MySQL 中 `GROUP BY` 到底是如何实现的。作者从一个常见的误解出发——很多人根据执行计划中的 `Using filesort` 认为,`GROUP BY` 是“先排序,后分组”。但真的是这样吗? 作者通过一个对比实验来验证:在查询中显式添加 `ORDER BY NULL` 后,`filesort` 消失了,结果行的出现顺序也发生了改变。这说明排序并非分组的必要步骤,而是后续的一个可选操作。 文章深入到了算法层面。MySQL 实际采用的是一种更高效的哈希分组算法:它会创建一个临时表,遍历原表数据时,根据分组键(key)进行哈希查找。若 key 存在则更新计数,不存在则插入新行。整个过程无需预先排序,时间复杂度是 O(n)。 最后,文章解释了默认情况下我们看到的结果是“有序”的,那仅仅是因为 MySQL 默认在分组后追加了一次排序操作。这与“先排序后分组”的直觉正好相反。

IT 累计浏览 2,813

WebGame行业案例:in子查询group by引发的“血案”

这篇讲的是一个WebGame项目中,因一条看似平常的SQL查询——使用了`IN`子查询与`GROUP BY`的组合——所引发的线上生产故障。文章详细复盘了这个过程:在特定业务场景下,随着数据量增长,数据库优化器对这类查询的执行计划选择了极其低效的路径,导致全表扫描和临时表溢出,最终使核心接口响应超时,引发了游戏内的连锁反应。 作者不仅定位到了“根因是`IN`子查询在特定条件下未能被有效优化”,还深入剖析了背后的执行原理。解决的关键在于将`IN`子查询重写为更优化的`JOIN`或`EXISTS`写法,并辅以合理的索引设计。文章最终通过压测数据对比,展示了优化后查询性能的显著提升,从原先的数秒降至毫秒级,彻底解决了这个隐蔽的“血案”。 对于后端开发和DBA而言,这个案例生动地说明了:在复杂查询中,不能仅凭逻辑正确就掉以轻心,必须结合数据量审视执行计划,理解数据库优化器的行为差异。一些“经典”的查询模式在特定条件下可能会成为性能杀手。

IT 累计浏览 3,941

过滤部分字段重复的数据

这篇讲的是在处理数据库查询时,一个看似简单却很实际的需求:如何过滤仅部分字段重复的记录。很多开发者习惯性地使用 `SELECT DISTINCT`,但它判断的是整行数据的唯一性。文章正是从这个常见的认知起点出发,点明了当业务要求基于特定字段(如姓名、电话)来去重,而允许其他字段(如ID、创建时间)不同时,`DISTINCT` 就无能为力了。 作者接着对比了两种关键的解决方案。一种是传统的 `GROUP BY` 结合聚合函数(如 `MAX`、`MIN`)来选取每组中的特定记录,这适用于明确需要保留哪条数据的场景。另一种是更现代的窗口函数方法(如 `ROW_NUMBER()`),它能为每组重复数据按规则排序并打上编号,再筛选编号为1的记录,这种方式在逻辑上更灵活,尤其适合复杂排序或需要保留“最新”、“第一条”等场景。 文章没有停留在语法层面,而是强调了选择哪种方案背后的思考:你需要明确“去重”的业务标准究竟是什么,以及对性能和结果完整性的要求。对于想要精准控制去重逻辑的开发者来说,理清 `DISTINCT`、`GROUP BY` 和窗口函数之间的差异与适用边界,是写出高效且正确查询的关键一步。

IT 累计浏览 1,833

关于mysql中的DISTINCT

这篇文章源自一次实际踩坑经历,作者在清理代理服务器日志中的IP数据时,试图用`select *, distinct ip from table`来去重,却发现无法得到预期结果。 问题根源在于对`DISTINCT`关键字的误解:它只能对整个`SELECT`列表中的所有列进行组合去重。当查询中还包含其他列(如文章中的原始日期列)时,除非所有数据行在所有列上都完全相同,否则无法实现仅按IP列去重的预期效果。 作者随后找到了正确的解决方案:使用`GROUP BY ip`配合`MAX(date)`这样的聚合函数。这种方法能先按IP分组,再为每个IP选取最新的日期,从而在保留每组其他信息的同时,精准地实现单列的去重与数据聚合。这对于需要保留分组最新状态的去重场景非常实用。 这个从错误尝试到找到正解的过程,清晰地区分了`DISTINCT`与`GROUP BY`的核心差异,能帮助开发者避免在项目里重复踩坑。