`
yinwufeng
  • 浏览: 286977 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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.   
  9. mysql> delimiter ||  //改变mysql命令结束符为||   
  10.   
  11. //建个储存过程向表中插入10W条数据   
  12. mysql> create procedure p_test(pa int(11))   
  13.  -> begin   
  14.  ->   
  15.  ->  declare max_num int(11) default 100000;   
  16.  ->  declare i int default 0;   
  17.  ->  declare rand_num int;   
  18.  ->   
  19.  ->  select count(id) into max_num from test_test;   
  20.  ->   
  21.  ->  while i < pa do  
  22.  ->          if max_num < 100000 then   
  23.  ->                  select cast(rand()*100 as unsigned) into rand_num;   
  24.  ->                  insert into test_test(num)values(rand_num);   
  25.  ->          end if;   
  26.  ->          set i = i +1;   
  27.  ->  end while;   
  28.  -> end||   
  29. Query OK, 0 rows affected (0.00 sec)   
  30.   
  31. mysql> call p_test(100000)||   
  32. Query OK, 1 row affected (5.66 sec)   
  33.   
  34. mysql> delimiter ;//改变mysql命令结束符为;   
  35. mysql> select count(id) from test_test;  //数据都进去了   
  36. +-----------+   
  37. count(id) |   
  38. +-----------+   
  39. |    100000 |   
  40. +-----------+   
  41. 1 row in set (0.00 sec)   
  42.   
  43. mysql> show variables like "%pro%";   //查看一下,记录执行的profiling是不是开启动了,默认是不开启的   
  44. +---------------------------+-------+   
  45. | Variable_name             | Value |   
  46. +---------------------------+-------+   
  47. | profiling                 | OFF   |   
  48. | profiling_history_size    | 15    |   
  49. | protocol_version          | 10    |   
  50. | slave_compressed_protocol | OFF   |   
  51. +---------------------------+-------+   
  52. 4 rows in set (0.00 sec)   
  53.   
  54. mysql> set profiling=1;           //开启   
  55. 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.   
  5. mysql> show profiles;    //查看结果   
  6. +----------+------------+-------------------------------------------+   
  7. | Query_ID | Duration   | Query                                     |   
  8. +----------+------------+-------------------------------------------+   
  9. |        1 | 0.07298225 | select distinct(num) from test_test       |   
  10. |        2 | 0.07319975 | select num from test_test group by num    |   
  11. |        3 | 0.07313525 | select num from test_test group by num    |   
  12. |        4 | 0.07317725 | select distinct(num) from test_test       |   
  13. |        5 | 0.07275200 | select distinct(num) from test_test       |   
  14. |        6 | 0.07298600 | select num from test_test group by num    |   
  15. |        7 | 0.07500700 | select num from test_test group by num    |   
  16. |        8 | 0.07331325 | select distinct(num) from test_test       |   
  17. |        9 | 0.57831575 | create index num_index on test_test (num) |  //在这儿的时候,我加了索引   
  18. |       10 | 0.00243550 | select distinct(num) from test_test       |   
  19. |       11 | 0.00121975 | select num from test_test group by num    |   
  20. |       12 | 0.00116550 | select distinct(num) from test_test       |   
  21. |       13 | 0.00107650 | select num from test_test group by num    |   
  22. +----------+------------+-------------------------------------------+   
  23. 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://blog.51yip.com/mysql/1105.html

分享到:
评论

相关推荐

    Mysql中distinct与group by的去重方面的区别

    在MySQL数据库中,`DISTINCT` 和 `GROUP BY` 是两个非常重要的SQL关键字,它们都可以用来处理数据的去重问题,但在实际应用中,两者的使用场景和效果有所差异。 首先,`DISTINCT` 关键字的主要作用是去除查询结果中...

    【DISTINCT】优化之MySQL官方文档翻译

    通过对MySQL处理`DISTINCT`优化的理解,我们可以更好地设计和调整查询语句,以提高查询性能。在实际应用中,根据具体的查询需求和数据特点选择合适的优化策略是非常重要的。希望本文能为您的数据库性能优化提供一定...

    分析MySQL中优化distinct的技巧

    MySQL的优化器将`DISTINCT`操作转换为`GROUP BY`,使得查询在利用索引分组后,仅扫描一次所需的`nick`值。在新的执行计划中,`Using index for group-by`表明查询利用索引完成了分组操作,从而提高了效率。 通过...

    MySQL中distinct与group by语句的一些比较及用法讲解

    在MySQL数据库中,`DISTINCT` 和 `GROUP BY` 是两种用于数据去重和分组统计的SQL语句,它们虽然都可以帮助我们处理重复数据,但有着不同的应用场景和执行机制。 1. `DISTINCT` 关键字: - `DISTINCT` 主要用于去除...

    MySQL中distinct与group by之间的性能进行比较

    在MySQL数据库中,`DISTINCT` 和 `GROUP BY` 是两个用于数据去重的语句,但它们在功能和性能上有显著的区别。这次的测试主要比较了这两种方法在不同条件下的执行效率,尤其是在数据量较大的情况下。 首先,`...

    MySQL中索引优化distinct语句及distinct的多字段操作

    MySQL通常使用GROUPBY(本质上是排序动作)完成DISTINCT操作,如果DISTINCT操作和ORDERBY操作组合使用,通常会用到临时表.这样会影响性能. 在一些情况下,MySQL可以使用索引优化DISTINCT操作,但需要活学活用.本文涉及一个...

    MySQL中Distinct和Group By语句的基本使用教程

    在MySQL数据库中,`DISTINCT`和`GROUP BY`是两个非常重要的查询语句,它们在处理数据去重和分组方面发挥着关键作用。本文将详细介绍这两个语句的使用方法。 首先,`DISTINCT`关键字是用来去除查询结果中重复记录的...

    MySQL DISTINCT 的基本实现原理详解

    4. 结合GROUP BY和聚合函数: 当DISTINCT与GROUP BY结合使用,或者使用聚合函数如MAX、MIN等时,MySQL可能需要进行排序(filesort)操作。这是因为GROUP BY通常需要对数据进行分组,而分组操作往往涉及排序。此时,...

    用Distinct在MySQL中查询多条不重复记录值,绝对的物有所值

    我们了解到`DISTINCT`关键字在MySQL中的运用远不止去除简单重复值这么简单,它与`GROUP BY`、`COUNT`、`GROUP_CONCAT`等其他SQL功能结合,能够应对更为复杂的查询需求,极大地提升了数据处理的灵活性和效率。...

    MySQL中distinct语句的基本原理及其与group by的比较

    在MySQL数据库中,`...总的来说,`DISTINCT`和`GROUP BY`在功能上有一定的重叠,但在具体的应用场景和性能上各有优势。了解它们的底层工作原理可以帮助我们更好地编写和优化SQL查询,以满足特定的数据库操作需求。

    MySQL优化GROUP BY方案

    总结,MySQL的GROUP BY优化主要依赖于有效的索引策略和适当的查询设计。理解这些优化机制可以帮助开发人员编写出更高效的SQL查询,提高数据库性能。在实际操作中,应该根据具体的数据分布和查询模式来调整索引和查询...

    高性能MySQL(第3版).part2

    6.7.4优化GROUPBY和DISTINCT239 6.7.5优化LIMIT分页241 6.7.6优化SQL_CALC_FOUND_ROWS243 6.7.7优化UNION查询243 6.7.8静态查询分析244 6.7.9使用用户自定义变量244 6.8案例学习251 6.8.1使用MySQL构建一个...

Global site tag (gtag.js) - Google Analytics