• 云途科技成立于2010年 - 专注全球跨境电商服务器租赁托管!
  • 帮助中心

    您可以通过下方搜索框快速查找您想知道的问题

    mysql distinct和group by谁更好

      in  数据库      Tags: 

    今天无意中听到有同事在讨论,distinct和group by谁的速度会更快一点,意件不一,其实我也不知道那个好,下午有时间做了一下测试。

    1,测试前的准备

    //准备一张测试表
    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,测试

    //做了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 会好一点点

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



    • 外贸虚拟主机

      1GB硬盘

      2个独立站点

      1000M带宽

      不限制流量

      美国外贸专用虚拟主机,cPanel面板,每天远程备份.
      服务器配置:2*E5 32核,96GB 内存,4*2TB 硬盘 RAID10 阵列.

      ¥180/年

    • 美国/荷兰外贸VPS

      2核CPU

      1G内存

      30硬盘

      10M带宽

      美国/荷兰外贸云服务器,专注外贸服务器行业12年.
      服务器配置:2*E5 32核,96GB 内存,4*2TB 硬盘 RAID10 阵列.

      ¥99/月

    • 全球外贸服务器

      8核CPU

      32G内存

      1TB硬盘

      1000M带宽

      已部署数据中心:美国洛杉矶/亚特兰大、荷兰、加拿大、英国伦敦、德国、拉脱维亚、瑞典、爱沙尼亚
      自有机柜(全球九大数据中心),稳定在线率:99.9%

      ¥999/月 原价1380

    7*24小时 在线提交工单

    如果您的问题没有得到解决,推荐您在线提交工单,我们的客服人员会第一时间为您解决问题

    展开