mysql distinct和group by性能  
1,测试前的准备
  1. //准备一张测试表
  2. mysql> CREATE TABLE `test_test` (
  3. ->   `id` int(11) NOT NULL auto_increment,
  4. ->   `num` int(11) NOT NULL default '0',
  5. ->   PRIMARY KEY  (`id`)
  6. -> ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
  7. Query OK, 0 rows affected (0.05 sec)
  8. mysql> delimiter ||  //改变mysql命令结束符为||
  9. //建个储存过程向表中插入10W条数据
  10. mysql> create procedure p_test(pa int(11))
  11. -> begin
  12. ->
  13. ->  declare max_num int(11) default 100000;
  14. ->  declare i int default 0;
  15. ->  declare rand_num int;
  16. ->
  17. ->  select count(id) into max_num from test_test;
  18. ->
  19. ->  while i < pa do
  20. ->          if max_num < 100000 then
  21. ->                  select cast(rand()*100 as unsigned) into rand_num;
  22. ->                  insert into test_test(num)values(rand_num);
  23. ->          end if;
  24. ->          set i = i +1;
  25. ->  end while;
  26. -> end||
  27. Query OK, 0 rows affected (0.00 sec)
  28. mysql> call p_test(100000)||
  29. Query OK, 1 row affected (5.66 sec)
  30. mysql> delimiter ;//改变mysql命令结束符为;
  31. mysql> select count(id) from test_test;  //数据都进去了
  32. +-----------+
  33. | count(id) |
  34. +-----------+
  35. |    100000 |
  36. +-----------+
  37. 1 row in set (0.00 sec)
  38. mysql> show variables like "%pro%";   //查看一下,记录执行的profiling是不是开启动了,默认是不开启的
  39. +---------------------------+-------+
  40. | Variable_name             | Value |
  41. +---------------------------+-------+
  42. | profiling                 | OFF   |
  43. | profiling_history_size    | 15    |
  44. | protocol_version          | 10    |
  45. | slave_compressed_protocol | OFF   |
  46. +---------------------------+-------+
  47. 4 rows in set (0.00 sec)
  48. mysql> set profiling=1;           //开启
  49. Query OK, 0 rows affected (0.00 sec)
//准备一张测试表
mysql> CREATE TABLE `test_test` (
->   `id` int(11) NOT NULL auto_increment,
->   `num` int(11) NOT NULL default '0',
->   PRIMARY KEY  (`id`)
-> ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Query OK, 0 rows affected (0.05 sec) mysql> delimiter ||  //改变mysql命令结束符为|| //建个储存过程向表中插入10W条数据
mysql> create procedure p_test(pa int(11))
-> begin
->
->  declare max_num int(11) default 100000;
->  declare i int default 0;
->  declare rand_num int;
->
->  select count(id) into max_num from test_test;
->
->  while i < pa do
->          if max_num < 100000 then
->                  select cast(rand()*100 as unsigned) into rand_num;
->                  insert into test_test(num)values(rand_num);
->          end if;
->          set i = i +1;
->  end while;
-> end||
Query OK, 0 rows affected (0.00 sec) mysql> call p_test(100000)||
Query OK, 1 row affected (5.66 sec) mysql> delimiter ;//改变mysql命令结束符为;
mysql> select count(id) from test_test;  //数据都进去了
+-----------+
| count(id) |
+-----------+
|    100000 |
+-----------+
1 row in set (0.00 sec) mysql> show variables like "%pro%";   //查看一下,记录执行的profiling是不是开启动了,默认是不开启的
+---------------------------+-------+
| Variable_name             | Value |
+---------------------------+-------+
| profiling                 | OFF   |
| profiling_history_size    | 15    |
| protocol_version          | 10    |
| slave_compressed_protocol | OFF   |
+---------------------------+-------+
4 rows in set (0.00 sec) mysql> set profiling=1;           //开启
Query OK, 0 rows affected (0.00 sec)

2,测试

  1. //做了4组测试
  2. mysql> select distinct(num) from test_test;
  3. mysql> select num from test_test group by num;
  4. mysql> show profiles;    //查看结果
  5. +----------+------------+-------------------------------------------+
  6. | Query_ID | Duration   | Query                                     |
  7. +----------+------------+-------------------------------------------+
  8. |        1 | 0.07298225 | select distinct(num) from test_test       |
  9. |        2 | 0.07319975 | select num from test_test group by num    |
  10. |        3 | 0.07313525 | select num from test_test group by num    |
  11. |        4 | 0.07317725 | select distinct(num) from test_test       |
  12. |        5 | 0.07275200 | select distinct(num) from test_test       |
  13. |        6 | 0.07298600 | select num from test_test group by num    |
  14. |        7 | 0.07500700 | select num from test_test group by num    |
  15. |        8 | 0.07331325 | select distinct(num) from test_test       |
  16. |        9 | 0.57831575 | create index num_index on test_test (num) |  //在这儿的时候,我加了索引
  17. |       10 | 0.00243550 | select distinct(num) from test_test       |
  18. |       11 | 0.00121975 | select num from test_test group by num    |
  19. |       12 | 0.00116550 | select distinct(num) from test_test       |
  20. |       13 | 0.00107650 | select num from test_test group by num    |
  21. +----------+------------+-------------------------------------------+
  22. 13 rows in set (0.00 sec)
//做了4组测试
mysql> select distinct(num) from test_test;
mysql> select num from test_test group by num; mysql> show profiles;    //查看结果
+----------+------------+-------------------------------------------+
| Query_ID | Duration   | Query                                     |
+----------+------------+-------------------------------------------+
|        1 | 0.07298225 | select distinct(num) from test_test       |
|        2 | 0.07319975 | select num from test_test group by num    |
|        3 | 0.07313525 | select num from test_test group by num    |
|        4 | 0.07317725 | select distinct(num) from test_test       |
|        5 | 0.07275200 | select distinct(num) from test_test       |
|        6 | 0.07298600 | select num from test_test group by num    |
|        7 | 0.07500700 | select num from test_test group by num    |
|        8 | 0.07331325 | select distinct(num) from test_test       |
|        9 | 0.57831575 | create index num_index on test_test (num) | //在这儿的时候,我加了索引
|       10 | 0.00243550 | select distinct(num) from test_test       |
|       11 | 0.00121975 | select num from test_test group by num    |
|       12 | 0.00116550 | select distinct(num) from test_test       |
|       13 | 0.00107650 | select num from test_test group by num    |
+----------+------------+-------------------------------------------+
13 rows in set (0.00 sec)

上面的1-8是4组数据,并且是没有加索引的,从中我们可以看出,distinct比group by 会好一点点

10-13是2组数据,是加了索引以后的,从中我们可以看出,group by 比distinct 会好一点点

一般情况,数据量比较大的表,关联字段都会加索引的,,并且加索引后检索时间只有以前的六分之一左右。

http://www.myexception.cn/mysql/516305.html

mysql distinct跟group by性能的更多相关文章

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

    MySQL中distinct和group by性能比较[转] 之前看了网上的一些测试,感觉不是很准确,今天亲自测试了一番.得出了结论(仅在个人计算机上测试,可能不全面,仅供参考) 测试过程: 准备一张 ...

  2. Mysql distinct、group by

    具体业务场景:根据某些字段组合去重得到所有字段结果. 遇到的error:sql_mode=only_full_group_by. 原因是mysql配置问题. distinct: distinct这个关 ...

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

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

  4. 44 答疑(三)--join的写法/Simple nested loop join的性能问题/Distinct和group by的性能/备库自增主键问题

    44 答疑(三) Join的写法 35节介绍了join执行顺序,加了straight_join,两个问题: --1 如果用left join,左边的表一定是驱动表吗 --2 如果两个表的join包含多 ...

  5. distinct和group by的性能比较

    distinct和group by的性能比较 当去重复的字段 的个数比较多的时候,group by 比distinct要快很多 当去重复的字符 的个数比较少的时候,distinct 比group by ...

  6. mysql数据去重复distinct、group by

    使用distinct 和group by都可以实现数据去重. select distinct 字段 group by 一般放在where条件后

  7. Mysql视图的作用及其性能分析

    定义:视图是从一个或几个基本表导出的表,它与基本表不同,是一个虚表. 作用: 1.简化操作,不用进行多表查询. 2.当不同种类的用用户共享同一个数据库时,非常灵活,(用户以不同的 方式看待同一数据. ...

  8. 高性能mysql 第6章 查询性能优化

    查询缓存: 在解析一个sql之前,如果查询缓存是打开的,mysql会去检查这个查询(根据sql的hash作为key)是否存在缓存中,如果命中的话,那么这个sql将会在解析,生成执行计划之前返回结果. ...

  9. MYSQL索引结构原理、性能分析与优化

    [转]MYSQL索引结构原理.性能分析与优化 第一部分:基础知识 索引 官方介绍索引是帮助MySQL高效获取数据的数据结构.笔者理解索引相当于一本书的目录,通过目录就知道要的资料在哪里, 不用一页一页 ...

随机推荐

  1. AngularJS 拦截器和好棒例子

    目录[-] 什么是拦截器? 异步操作 例子 Session 注入(请求拦截器) 时间戳(请求和响应拦截器) 请求恢复 (请求异常拦截) Session 恢复 (响应异常拦截器) 总结 Intercep ...

  2. UVA 10585 Center of symmetry

    题意:给出一个点集,问这个集合有没有中心点使点集对称,这个点可以是点集中的点也可以不是点集的点. 解法:一开始我枚举每两个点连线的中点……结果T了orz当时也不知道怎么想的…… 将点按横坐标排序,如果 ...

  3. 任务栏窗口和状态图标的闪动 z

    Demo程序: 实现任务栏窗体和图标的闪动: 整个程序是基于Windows Forms的,对于任务栏右下角状态图标的闪动,创建了一个类型:NotifyIconAnimator,基本上是包装了Windo ...

  4. 【Tcpcopy】离线回放功能

    最近因调试问题,需要一直进行tcpcopy,拿有问题的包进行测试.决定使用tcpcopy对录制脚本进行回放,以下为我操作的具体步骤.主要是三块 1 下载安装具有离线回放功能的tcpcopy 2 使用t ...

  5. 第一个GTK+程序

    在这一章节中,我们将开始编写第一个GTK+程序. 超级简单的例子 我们要“制造”一个超级简单的GTK+程序.就是显示一个空白的窗口. #include <gtk/gtk.h> int ma ...

  6. Hadoop2.7.2安装笔记

    1.设置免密SSH登录 $ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa $ cat ~/.ssh/id_dsa.pub >> ~/.ssh/autho ...

  7. IO 图

  8. unix 文件属性

    在unix下提到文件属性,不得不提的一个结构就是stat,stat结构一般定义如下: struct stat { dev_t st_dev; /* ID of device containing fi ...

  9. 50道经典的JAVA编程题 (11-15)

    50道经典的JAVA编程题 (11-15),新年的第一天,继续啦...\(^o^)/~,这50道题都跨年了啊...哈哈 [程序11] TestTN.java 题目:有1.2.3.4个数字,能组成多少个 ...

  10. Tomcat普通用户启动注意事项

    今天项目部署上线,老大跟我建议说不要使用root用户部署,试用普通用户运行.刚开始没想什么,后来部署的时候碰到各种权限问题. 记录一下,以防忘记了. 1.使用普通用户启动失败. 首先不用想就去$TOM ...