distinct是什么意思

更新时间:2022-11-25 11:55:33 阅读: 评论:0


2022年11月25日发(作者:生如夏花般绚烂)

mysql下distinct和groupby区别对⽐

在数据表中记录了⽤户验证时使⽤的书⽬,现在想取出所有书⽬,⽤DISTINCT和都取到了我想要的结果,但我发现返回结果排列不

同,distinct会按数据存放顺序⼀条条显⽰,⽽groupby会做个排序(⼀般是ASC)。

DISTINCT实际上和GROUPBY操作的实现⾮常相似,只不过是在GROUPBY之后的每组中只取出⼀条记录⽽已。所以,DISTINCT的

实现和GROUPBY的实现也基本差不多,没有太⼤的区别,同样可以通过松散索引扫描或者是紧凑索引扫描来实现。

那DISTINCT和GROUPBY哪个效率更⾼?

DISTINCT操作只需要找出所有不同的值就可以了。⽽GROUPBY操作还要为其他聚集函数进⾏准备⼯作。从这⼀点上将,GROUPBY操

作做的⼯作应该⽐DISTINCT所做的⼯作要多⼀些。

但实际上,GROUPBY效率会更⾼点,为什么呢?对于DISTINCT操作,它会读取了所有记录,⽽GROUPBY需要读取的记录数量与分组

的组数量⼀样多,也就是说⽐实际存在的记录数⽬要少很多。

例⼦aa表ab

12310

12312

123411

123414

⾸先group是⽤来分组的不是过滤重复项的。重复项删除语句DISTINCT⽤这个。DISTINCT(a)fromaa

结果就是a

123

1234

groupby⽤来分组的

lecta,sum(b)fromaagroupbya

sum意思是总和。结果就是

ab

12322

123425

语句的⽬的是以a为⽬标需要知道相同名字的物品在b列⼀共有多少数量总和

lecta,count(b)fromaagroupbya

count意思⾏数总和结果就是

ab

1232

12342

语句⽬的是相同名字的物品⼀共有⼏⾏

MySQL中distinct和groupby性能⽐较

测试过程:

准备⼀张测试表

CREATETABLE`test_test`(

`id`int(11)NOTNULLauto_increment,

`num`int(11)NOTNULLdefault'0',

PRIMARYKEY(`id`)

)ENGINE=MyISAMDEFAULTCHARSET=utf8AUTO_INCREMENT=1;

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

createprocedurep_test(paint(11))

begin

declaremax_numint(11)default100000;

declareiintdefault0;

declarerand_numint;

lectcount(id)intomax_numfromtest_test;

whilei

ifmax_num<100000then

lectcast(rand()*100asunsigned)intorand_num;

inrtintotest_test(num)values(rand_num);

endif;

ti=i+1;

endwhile;

end

调⽤存储过程插⼊数据

1callp_test(100000);

开始测试:(不加索引)

lectdistinctnumfromtest_test;

lectnumfromtest_testgroupbynum;

[SQL]lectdistinctnumfromtest_test;

受影响的⾏:0

时间:0.078ms

lectnumfromtest_testgroupbynum;

受影响的⾏:0

时间:0.031ms

⼆、num字段上创建索引

ALTERTABLE`test_test`ADDINDEX`num_index`(`num`);

再次查询

lectdistinctnumfromtest_test;

lectnumfromtest_testgroupbynum;

[SQL]lectdistinctnumfromtest_test;

受影响的⾏:0

时间:0.000ms

lectnumfromtest_testgroupbynum;

受影响的⾏:0

时间:0.000ms

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

我们转到命令⾏下测试

mysql>tprofiling=1;

mysql>lectdistinct(num)fromtest_test;

mysql>lectnumfromtest_testgroupbynum;

mysql>showprofiles;

+----------+------------+----------------------------------------+

|Query_ID|Duration|Query|

+----------+------------+----------------------------------------+

|1|0.00072550|lectdistinct(num)fromtest_test|

|2|0.00071650|lectnumfromtest_testgroupbynum|

+----------+------------+----------------------------------------+

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

加了索引之后groupby⽐没加索引的groupby快了43倍。

再来对⽐:distinct和groupby

不管是加不加索引groupby都⽐distinct快。因此使⽤的时候建议选groupby

本文发布于:2022-11-25 11:55:33,感谢您对本站的认可!

本文链接:http://www.wtabcd.cn/fanwen/fan/90/18303.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图