distinct和group by的效率比较

-- 创建一个测试表

create table tp_content(
id int not null,
title char(32) not null,
addtime date not null default ‘2000-01-01‘
) engine = myisam default charset = utf8;

-- 修改sql语句的结束符
delimiter $
-- 创建一个存储过程,插入100万条测试数据
CREATE PROCEDURE load_data()
begin
declare i int default 0;
while i < 1000000
do
insert into tp_content values (i,replace(uuid(), ‘-‘, ‘‘),adddate(‘2000-01-01‘,(rand(i)*36520) mod 3652));
set i = i + 1;
end while;
end
$

call load_data();
-- 修改回原来的结束符
delimiter ;

1、没有建立主键的对比

-- 运行distinct的sql语句

-- 运行group by的sql语句

2、建立主键的对比

-- 建立id主键
alter table tp_content add primary key(id);

distinct

group by

结论:

上面的例子可以看出:没有建立主键时,distinct查询的速度要比group by快一点(distinct的时间是30.934s,group by的时间是33.905s),而建立主键后group by和distinct的效率都提高了,但是两者的速度依然差不多(distinct的时间是2.753s,group by的时间是2.762s)。

由于个人电脑的性能比较差,查出的时间比较久,所以这里的时间只是相对时间,假如用更好性能的电脑做实验,时间会快,但是我想结论应该是差不多的。

时间: 2024-12-24 17:30:54

distinct和group by的效率比较的相关文章

(转)数据库 distinct 和 group by 的区别

这两者本质上应该没有可比性,distinct 取出唯一列,group by 是分组,但有时候在优化的时候,在没有聚合函数的时候,他们查出来的结果也一样. 举例来说可能方便一点. A表 id num a 1 b 2 c 3 a 4 c 7 d 3 e 5 如果只选出id列,用distinct和group by 一样的. select distinct(id) from A; id a b c d e; select id from A group by id; id a b c d e; 不同之处

Mongodb中数据聚合之基本聚合函数count、distinct、group

在之前的文章<Mongodb中数据聚合之MapReduce>中,我们提到过Mongodb中进行数据聚合操作的一种方式--MapReduce,但是在大多数日常使用过程中,我们并不需要使用MapReduce来进行操作,不然有点杀鸡用牛刀的感觉,在这边文章中,我们就简单说说用自带的聚合函数进行数据聚合操作的实现. Mongodb中自带的基本聚合函数有三种:count.distinct和group.下面我们分别来讲述一下这三个基本聚合函数. (1)count 作用:简单统计集合中符合某种条件的文档数量

mongo中的高级查询之聚合操作(distinct,count,group)

1.distinct的实现: db.consumerecords.distinct("userId"):键值去重  类似于mysql中的 select distinct userId from consumerecords db.consumerecords.distinct("userId",{act:"charge"}):过滤之后去重,类似于mysql中的select distinct userId from consumerecords w

关于SQL语句中的distinct和group by

两种都能实现去重功能.区别: distinct只是将重复的行从结果中出去: group by是按指定的列分组,一般这时在select中会用到聚合函数. distinct是把不同的记录显示出来 group by是在查询时先把纪录按照类别分出来再查询. group by 必须在查询结果中包含一个聚集函数,而distinct不用.

Mysql中count(*),DISTINCT的使用方法和效率研究

在处理一个大数据量数据库的时候突然发现mysql对于count(*)的不同处理会造成不同的结果 比如执行SELECT count(*) FROM tablename即使对于千万级别的数据mysql也能非常迅速的返回结果而对于SELECT count(*) FROM tablename WHERE.....mysql的查询时间开始攀升 仔细查阅累下手册,发现当没有WHERE语句对于整个mysql的表进行count运算的时候MyISAM类型的表中保存有总的行数,而当添加有WHERE限定语句的时候My

Distinct和Group by去除重复字段记录

重复记录 有两个意义,一是完全重复的记录,也即所有字段均重复的记录 二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略. 1.对于第一种重复,比较容易解决,使用 select distinct * from tableName 就可以得到无重复记录的结果集. 如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除 select distinct * into #Tmp from tableName drop table tableName sele

MongoDB快速入门(十三-聚合count、distinct和group)

1. count: --在空集合中,count返回的数量为0. > db.test.count()    0    --测试插入一个文档后count的返回值.    > db.test.insert({"test":1})    > db.test.count()    1    > db.test.insert({"test":2})    > db.test.count()    2    --count和find一样,也接受条件.

重复数据分析的三个常用语法distinct, group by, partition by

由于数据经常会出现重复现象,数据去重是数据分析中常用操作之一,而distinct,group by, partition by三者都可以实现去重功能,实践中需要根据不同的场景需求来选取相应的语法. distinct: 只需要去除重复数据,保留无重复数据 group by:可以根据需要查看哪些数据是重复的 partition by:功能最为强大,可以给重复数据排序,结合外层嵌套语句,可实现按需过滤不需要的数据.

MySQL优化之COUNT(*)效率(部分转载与个人亲测)

说到MySQL的COUNT(*)的效率,发现越说越说不清楚,干脆写下来,分享给大家. COUNT(*)与COUNT(COL)网上搜索了下,发现各种说法都有:比如认为COUNT(COL)比COUNT(*)快的:认为COUNT(*)比COUNT(COL)快的:还有朋友很搞笑的说到这个其实是看人品的. 在不加WHERE限制条件的情况下,COUNT(*)与COUNT(COL)基本可以认为是等价的:但是在有WHERE限制条件的情况下,COUNT(*)会比COUNT(COL)快非常多: 具体的数据参考如下: