MySQL中distinct和group by性能比较[转]

之前看了网上的一些测试,感觉不是很准确,今天亲自测试了一番。得出了结论(仅在个人计算机上测试,可能不全面,仅供参考)

测试过程:

准备一张测试表

1    CREATE TABLE `test_test` (
2 `id` int(11) NOT NULL auto_increment,
3 `num` int(11) NOT NULL default '0',
4 PRIMARY KEY (`id`)
5 ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

建个储存过程向表中插入10W条数据

01    create procedure p_test(pa int(11))
02 begin
03
04 declare max_num int(11) default 100000;
05 declare i int default 0;
06 declare rand_num int;
07
08 select count(id) into max_num from test_test;
09
10 while i < pa do
11 if max_num < 100000 then
12 select cast(rand()*100 as unsigned) into rand_num;
13 insert into test_test(num)values(rand_num);
14 end if;
15 set i = i +1;
16 end while;
17 end

调用存储过程插入数据

1    call p_test(100000);

开始测试:(不加索引)

01    select distinct num from test_test;
02 select num from test_test group by num;
03
04 [SQL] select distinct num from test_test;
05 受影响的行: 0
06 时间: 0.078ms
07
08 [SQL]
09 select num from test_test group by num;
10 受影响的行: 0
11 时间: 0.031ms

二、num字段上创建索引

1    ALTER TABLE `test_test` ADD INDEX `num_index` (`num`) ;

再次查询

01    select distinct num from test_test;
02 select num from test_test group by num;
03 [SQL] select distinct num from test_test;
04 受影响的行: 0
05 时间: 0.000ms
06
07 [SQL]
08 select num from test_test group by num;
09 受影响的行: 0
10 时间: 0.000ms

这时候我们发现时间太小了 0.000秒都无法精确了。

我们转到命令行下 测试

01    mysql> set profiling=1;
02 mysql> select distinct(num) from test_test;
03 mysql> select num from test_test group by num;
04 mysql> show profiles;
05 +----------+------------+----------------------------------------+
06 | Query_ID | Duration | Query |
07 +----------+------------+----------------------------------------+
08 | 1 | 0.00072550 | select distinct(num) from test_test |
09 | 2 | 0.00071650 | select num from test_test group by num |
10 +----------+------------+----------------------------------------+

加了索引之后 distinct 比没加索引的 distinct 快了 107倍。

加了索引之后 group by 比没加索引的 group by 快了 43倍。

再来对比 :distinct  和 group by

不管是加不加索引 group by 都比 distinct 快。因此使用的时候建议选 group by

MySQL中distinct和group by性能比较[转]的更多相关文章

  1. mysql下distinct和group by区别对比

    在数据表中记录了用户验证时使用的书目,现在想取出所有书目,用DISTINCT和group by都取到了我想要的结果,但我发现返回结果排列不同,distinct会按数据存放顺序一条条显示,而group ...

  2. mysql distinct跟group by性能

    mysql distinct和group by性能   1,测试前的准备 //准备一张测试表 mysql> CREATE TABLE `test_test` ( ->   `id` int ...

  3. mysql中distinct的用法

    本事例实验用表task,结构如下 MySQL> desc task; +-------------+------------+------+-----+-------------------+- ...

  4. 向mysql中批量插入数据的性能分析

    MYSQL批量插入数据库实现语句性能分析 假定我们的表结构如下 代码如下   CREATE TABLE example (example_id INT NOT NULL,name VARCHAR( 5 ...

  5. mysql中distinct

    1.Distinct 位置 单独的distinct只能放在开头,否则报错,语法错误,与其他函数使用时候,没有位置限制如下 Select player_id,count(distinct(task_id ...

  6. mysql中影响myisam引擎写入性能的三项设置

    一.LOW_PRIORITY1.对于myisam默认是写操作优先,读操作滞后.通过该项更改,可以使读操作优先,写操作在有空闲的时候再写入.但该项可能在理论上造成,写被永远阻塞. SQL语句中使用示例: ...

  7. 数据库mysql中distinct关键词

    在表中,可能会包含重复值.这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值.关键词 distinct用于返回唯一不同的值. 例如,在学生信息表中,你想查询该学校有多少个系.例如, ...

  8. mysql中百万级别分页查询性能优化

    前提条件: 1.表的唯一索引 2.百万级数据 SQL语句: select c.* FROM ( SELECT a.logid FROM tableA a where 1 = 1 <#if pho ...

  9. mysql 中合并查询结果union用法 or、in与union all 的查询效率

    mysql 中合并查询结果union用法 or.in与union all 的查询效率 (2016-05-09 11:18:23) 转载▼ 标签: mysql union or in 分类: mysql ...

随机推荐

  1. PHP基于数组的分页函数(核心函数array_slice())

    关于数组的分页函数,用数组进行分页的好处是可以方便的进行联合多表查询,只需要将查询的结果放在数组中就可以了以下是数组分页的函数,函数page_array用于数组的分页,函数show_array用于分页 ...

  2. px,pt,em,rem

    一直对px,pt,em,rem的认识有误区,现整理一下,供参考.之后还得整理下关于dpi相关的知识. px(pixe,像素l):是一个虚拟长度单位,是计算机系统的数字化图像长度单位,如果px要换算成物 ...

  3. Python 前端之JQuery

    查找: 选择器 筛选器 操作: CSS 属性 文本 事件: 优化 扩展: Form表单验证 Ajax: 偷偷发请求 www.php100.com/manual/jquery http://blog.j ...

  4. Net分布式系统之二:CentOS系统搭建Nginx负载均衡(下)

    上一篇文章介绍了VMWare12虚拟机.Linux(CentOS7)系统安装.部署Nginx1.6.3代理服务做负载均衡.接下来介绍通过Nginx将请求分发到各web应用处理服务. 一.Web应用开发 ...

  5. C#去掉list集合中的重复数据

    List<string> conList= new List<string>(); List<string> listII = new List<string ...

  6. 用Python玩转词云

    第一步:引入相关的库包: #coding:utf-8 __author__ = 'Administrator' import jieba #分词包 import numpy #numpy计算包 imp ...

  7. 奔小康赚大钱 hdu 2255( KM )

    http://acm.split.hdu.edu.cn/showproblem.php?pid=2255 带权匹配问题: #include <stdio.h> #include <a ...

  8. Python:迭代器

    迭代器:可以被next()函数调用并不断返回下一个值的对象称为迭代器. 可迭代对象:可以直接作用于for循环的对象. 基本方法:iter()和next() 迭代器创建: 例1: list = ['a' ...

  9. Unicode explorer

    It can be cumbersome to work out some of the details of this by hand, so you can use the little Java ...

  10. Android AppWidget

    AppWidget不知道大家使用这个多不多,这个在手机上也叫做挂件,挂件也就是放在桌面方便用户进行使用的,从android1.6开始挂件支持一些简单的lauout和view,到了android4.0之 ...