distinct mysql性能_mysql distinct跟group by性能

查看复制打印?

//准备一张测试表

mysql> CREATE TABLE `test_test` (

->   `id` int(11) NOT NULL auto_increment,

->   `num` int(11) NOT NULLdefault'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

->

->declaremax_num int(11)default100000;

->declarei intdefault0;

->declarerand_num int;

->

->  selectcount(id) into max_num from test_test;

->

->whilei 

->ifmax_num 

->                  select cast(rand()*100asunsigned) into rand_num;

->                  insert into test_test(num)values(rand_num);

->endif;

->          set i = i +1;

->endwhile;

->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> selectcount(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)

//准备一张测试表

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)

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值