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 条评论) |