group by 和 distinct 效率对比

数据库

CREATE TABLE `tb_user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `user_name` varchar(200) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `user_password` varchar(200) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `birth` datetime DEFAULT NULL,
  `sex` char(4) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `email` varchar(200) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `mobile` varchar(200) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `create_date` datetime DEFAULT NULL,
  `update_date` datetime DEFAULT NULL,
  `description` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=544579 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

数据量:50w 索引:无 区分度:低

1.处理字段  group by 

SELECT * from tb_user GROUP BY description;  1.517s

mysql 5.7 禁止这种sql规范 

SELECT description from tb_user GROUP BY description;  0.850s

SELECT DISTINCT description from tb_user  0.799s

对于低区分度数据来说 分组和去重操作 效率相近没有什么区别。

description 增加索引

SELECT description from tb_user group by description  0.004s

 

SELECT DISTINCT description from tb_user;  0.005s

增加索引: 无差别

 

 

2.使用高区分度字段

SELECT user_password from tb_user group by user_password 3.601s

SELECT DISTINCT user_password from tb_user; 2.082s

使用索引

SELECT user_password from tb_user group by user_password 0.779s

SELECT DISTINCT user_password from tb_user; 0.554

使用高区分度字段时 去重效果高于分组效果

增加字段索引降低效率差异。

 

结论: 当sql 去重时,建议使用 DISTINCT 处理。

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值