数据库
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 处理。