前言
- MySQL:5.7.17
- 存储引擎:InnoDB
- 实验目的:本文主要测试在某字段有无索引、各种不同值个数情况下,记录对此字段其使用
DISTINCT/GROUP BY去重的查询语句执行时间,对比两者在不同场景下的去重性能,实验过程中关闭MySQL查询缓存。 - 实验表格:
| 表名 | 记录数 | 查询字段有无索引 | 查询字段不同值个数 | DISTINCT | GROUP BY |
|---|---|---|---|---|---|
| tab_1 | 100000 | N | 3 | ||
| tab_2 | 100000 | Y | 3 | ||
| tab_3 | 100000 | N | 10000 | ||
| tab_4 | 100000 | Y | 10000 |
实验过程
1)创建测试表
表创建语句:
DROP TABLE IF EXISTS `tab_1`;
CREATE TABLE `tab_1` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`value` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `tab_2`;
CREATE TABLE `tab_2` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`value` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `idx_value` (`value`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `tab_3`;
CREATE TABLE `tab_3` LIKE `tab_1`;
DROP TABLE IF EXISTS `tab_4`;
CREATE TABLE `tab_4` LIKE `tab_2`;
2)生成测试数据
表数据插入过程:
DROP PROCEDURE IF EXISTS generateRandomData;
delimiter $$
-- tblName为插入表,field为插入字段,num为插入字段值上限,count为插入的记录数
CREATE PROCEDURE generateRandomData(IN tblName VARCHAR(30),IN field VARCHAR(30),IN num INT UNSIGNED,IN count INT UNSIGNED)
BEGIN
-- 声明循环变量
DECLARE i INT UNSIGNED DEFAULT 1;
-- 循环插入随机整数1~num,共插入count条数据
w1:WHILE i<=count DO
set i=i+1;
set @val = FLOOR(RAND()*num+1);
set @statement = CONCAT('INSERT INTO ',tblName,'(`',field,'`) VALUES(',@val,')');
PREPARE stmt FROM @statement;
EXECUTE stmt;
END WHILE w1;
END $$
delimiter ;
调用过程随机生成测试数据:
call generateRandomData('tab_1','value',3,100000);
INSERT INTO tab_2 SELECT * FROM tab_1;
call generateRandomData('tab_3','value',10000,100000);
INSERT INTO tab_4 SELECT * FROM tab_3;
3)执行查询语句,记录执行时间
查询语句及对应执行时间如下:
SELECT DISTINCT(`value`) FROM tab_1;
SELECT `value` FROM tab_1 GROUP BY `value`;
SELECT DISTINCT(`value`) FROM tab_2;
SELECT `value` FROM tab_2 GROUP BY `value`;
SELECT DISTINCT(`value`) FROM tab_3;
SELECT `value` FROM tab_3 GROUP BY `value`;
SELECT DISTINCT(`value`) FROM tab_4;
SELECT `value` FROM tab_4 GROUP BY `value`;
4)实验结果
| 表名 | 记录数 | 查询字段有无索引 | 查询字段不同值个数 | DISTINCT | GROUP BY |
|---|---|---|---|---|---|
| tab_1 | 100000 | N | 3 | 0.058s | 0.059s |
| tab_2 | 100000 | Y | 3 | 0.030s | 0.027s |
| tab_3 | 100000 | N | 10000 | 0.072s | 0.073s |
| tab_4 | 100000 | Y | 10000 | 0.047s | 0.049s |
实验结论
MySQL 5.7.17中使用distinct和group by进行去重时,性能相差不大
实验过程及结论,如有不足之处,欢迎指正,此实验结论仅供参考。

本文通过实验对比了MySQL 5.7.17版本中,使用DISTINCT与GROUP BY进行去重操作的性能表现,实验在不同字段索引与值个数条件下进行,发现两者性能相近。
811

被折叠的 条评论
为什么被折叠?



