`
san_yun
  • 浏览: 2662274 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

mysql中group的实现

 
阅读更多

同学问到group by的实现,发现可能存在误解,简单说明一下。

示例

CREATE TABLE `tb` (
  `c` int(11) DEFAULT NULL,
  `d` int(4) DEFAULT NULL,
  `e` varchar(1000) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Insert into tb values(2,20,’b’);
Insert into tb values(1,10,’a’);
Insert into tb values(2,20,’b’);
Insert into tb values(1,10,’a’);
Insert into tb values(3,30,’c’);

查询语句和结果

 

 

 

算法分析

其实细想一下,如果是先排序后分组,则时间复杂性为O(nlog(n)), 而示例中的需求,若只需要分组,其实可以更快一点。MySQL里的作法简单描述如下:

1、建一个空的临时表,三个字段分别为索引列、c、count(*)

    这里的” 索引列”就是group by 后的列计算结果,想象一下如果语句是group by 1/c什么的。 当然在我们的例子中,其值就是c。

2、从原表中一行行读入,先计算索引列的值key。 用key在临时表中查找,若key行存在,则update, 否则insert.

    在这个例子中,第一次读到c=2的行,则向临时表中插入一行 2, 2, 1。 第二次碰到c=2的行,则修改为2,2,2

3、原表全部遍历完成后,分组就结束了。因此我们看到加了order by null的查询结果c的出现顺序是 2, 1, 3,没有order by null的则是在这个基础上做了排序。

临时表中的查询就是简单的hash查找,我们看到这个算法的分组过程时间复杂度为O(n)。

分享到:
评论

相关推荐

    mysql使用GROUP BY分组实现取前N条记录的方法

    GROUP BY之后如何取每组的前两位下面我来讲述mysql中GROUP BY分组取前N条记录实现方法。 这是测试表(也不知道怎么想的,当时表名直接敲了个aa,汗~~~~): 结果: 方法一: 代码如下:SELECT a.id,a.SName,a.ClsNo...

    深入理解MySQL Group Replication

    在MySQL Group Replication中,数据的复制是基于日志的:主服务器(源服务器)将更改记录到二进制日志(binary log)中,然后这些日志被复制到从服务器(目标服务器),再由从服务器执行这些日志中的更改以保持数据...

    Mysql利用group by分组排序

    我们可以利用MySQL中的group by的特性。 MySQL的group by与Oracle有所不同,查询得字段可以不用写聚合函数,查询结果取得是每一组的第一行记录。 利用上面的特点,可以利用mysql实现一种独特的排序; 首先先按某个...

    数据分组的艺术:深入探索MySQL中的GROUP BY

    GROUP BY是MySQL中进行数据分组的强大工具,它与聚合函数一起使用,可以轻松实现复杂的数据分析。理解GROUP BY的工作原理和高级用法对于数据库开发者和分析师来说至关重要。通过合理使用GROUP BY,可以有效地从大量...

    MySQL5.8 Group Replication + F5实现高并发

    ### MySQL 5.8 Group Replication + F5 实现高并发集群搭建 #### 环境配置与需求 本文档将详细介绍如何通过 MySQL 5.8 的 Group Replication(MGR)结合 F5 负载均衡器来构建一个高可用、高并发的数据库集群。该...

    MySQL事物实现原理之组提交(group commit).pdf

    在MySQL中,事务的实现依赖于其强大的事务日志系统,而组提交(group commit)技术则是提高事务处理性能的关键技术之一。下面将详细解读MySQL事务实现原理之组提交的核心知识点。 首先,了解什么是WAL(Write-Ahead...

    mysql获取group by总记录行数的方法

    在MySQL数据库中,当执行`GROUP BY`语句时,通常是为了对数据进行分组并进行聚合计算,如计算每个组的总数、平均值等。然而,标准的`GROUP BY`查询并不直接提供每个组的行数,而是返回每个组的一行数据。如果需要...

    MySQL Group Replication环境搭建实战手册

    MySQL Group Replication是一种高可用性和高可扩展性的解决方案,它允许在MySQL集群中实现多主复制,即每个节点都可以读写,并且数据更改会在所有成员之间自动同步。本手册将指导您如何在单机上搭建MySQL 5.7.17的...

    MySQL优化GROUP BY方案

    MySQL中的GROUP BY语句用于对数据进行分组并计算每个组的聚合函数,如COUNT(), SUM(), AVG(), MAX(), MIN()等。在处理大数据量时,优化GROUP BY语句至关重要,因为它直接影响到查询性能。本篇文章将深入探讨MySQL...

    mysql 8.0中文参考手册

    12. **InnoDB Cluster**:MySQL 8.0引入的高可用性和可扩展性解决方案,通过Group Replication提供自动故障切换和数据安全性。 13. **JSON支持**:MySQL 8.0增强了对JSON格式的支持,包括JSON字段类型、查询和操作...

    nigix实现MYSQL主备高可用双活

    MySQL数据库在许多业务环境中是核心组件,为了保证数据的安全性和服务的连续性,通常需要实现主备高可用和双活架构。Nginx作为一个流行的反向代理服务器,可以通过配置实现对MySQL主备集群的负载均衡,提高系统的...

    使用keepalived实现对mysql主从复制的主备自动切换.docx

    keepalived是一款高可用性解决方案,可以实现虚拟IP的管理和服务监控,在mysql主从复制环境中使用keepalived可以实现自动切换,提高系统的可用性和可靠性。 Keepsalived概述 keepalived是一款开源的高可用性解决...

    Session_7_MySQL_Group_Replication_for_High_Availability

    - **数据同步**:MySQL Group Replication 使用一种基于二进制日志的复制机制,通过实时记录事务的变化并将其传播到组内的其他成员来实现数据同步。 - **故障检测与恢复**:组内的成员会持续监测其他成员的状态,...

    java连接mysql的 gui图形界 面实现增删改查

    在Java编程中,连接MySQL数据库并实现GUI图形界面的增删改查功能是一项常见的任务,尤其在开发桌面应用时。这个任务涉及到多个知识点,包括Java的数据库连接、Swing或JavaFX图形界面库的使用、SQL语言以及多线程处理...

    MySQL 数据库系统设计实现与管理第六版课后习题答案

    MySQL数据库系统设计实现与管理是数据库领域的一门重要课程,主要涵盖了数据库的基础理论、设计方法、实施技巧以及管理策略。第六版的教材深入浅出地介绍了MySQL这一流行的开源关系型数据库管理系统,为学习者提供了...

    MySQL分组查询Group By实现原理详解

     在MySQL 中,GROUP BY 的实现同样有多种(三种)方式,其中有两种方式会利用现有的索引信息来完成 GROUP BY,另外一种为完全无法使用索引的场景下使用。下面我们分别针对这三种实现方式做一个分析。  1、使用松散...

    Mysql 5.7 基于组复制(MySQL Group Replication) - 精华版

    "MySQL 5.7 基于组复制(MySQL Group Replication)" 本篇文章详细介绍了 MySQL 5.7 基于组复制(MySQL Group Replication)的配置说明,实为线上操作手册,在此分享,希望能帮助到有用到的朋友~ MySQL 组复制(MySQL...

Global site tag (gtag.js) - Google Analytics