MariaDB删除重复记录性能测试
删除重复记录,只保留id最大的一条记录的性能测试
环境
测试表的id为是唯一的,或是自增的主键。
mysql不能直接写循环,只能写在存储过程里。
存储过程usp_batch_insert的参数num_count为插入总行数,参数batch_commit为每批提交的行数。
由于是测试,先把bin log关闭。在生产上做删除重复记录操作,不能随意关闭,根据业务而定。
SET session sql_log_bin = 0;
创建测试表t3
CREATE TABLE `t3` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`f1` varchar(32) DEFAULT NULL,
`f2` varchar(32) DEFAULT NULL,
`ctime` datetime(3) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
每批量提交的记录表t3_log
CREATE TABLE `t3_log` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`i` bigint(20) DEFAULT NULL,
`ctime` datetime(3) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
构造数据的存储过程
DELIMITER $$
DROP PROCEDURE IF EXISTS `usp_batch_insert`;
CREATE PROCEDURE `usp_batch_insert`(IN `num_count` int,IN `batch_commit` int)
BEGIN
DECLARE i INT;
SET i = 1;
SET AUTOCOMMIT = 0;
WHILE i <= num_count DO
INSERT INTO t3 (f1, f2, ctime)
SELECT REPLACE(UUID(), '-', '') AS a, REPLACE(UUID(), '-', '') AS b, NOW(3) AS c;
SET i = i + 1;
IF MOD(i, batch_commit) <= 0 THEN
INSERT INTO t3_log (i, ctime) VALUES (i, NOW(3));
COMMIT;
END IF;
END WHILE;
SET AUTOCOMMIT = 1;
END; $$
DELIMITER ;
生成200万的测试数据
CALL usp_batch_insert(2000000, 5000);
把一部分数据重复
INSERT INTO t3 (f1,f2,ctime)
SELECT f1, f2, NOW(3) FROM t3 LIMIT 123456,10000;
INSERT INTO t3 (f1,f2,ctime)
SELECT f1, f2, NOW(3) FROM t3 LIMIT 15234567,254321;
INSERT INTO t3 (f1,f2,ctime)
SELECT f1, f2, NOW(3) FROM t3 LIMIT 345678,654321;
INSERT INTO t3 (f1,f2,ctime)
SELECT f1, f2, NOW(3) FROM t3 LIMIT 654321,45678;
INSERT INTO t3 (f1,f2,ctime)
SELECT f1, f2, NOW(3) FROM t3 LIMIT 886,123456;
INSERT INTO t3 (f1,f2,ctime)
SELECT f1, f2, NOW(3) FROM t3 LIMIT 15,2000;
数据已经构造完,全表280多万行记录,需要删除的数据有80多万。
下面就来测试下全过程的时间,总耗时是216秒,其中删除部分约29秒。
如果要保留最小id的那行记录,则把max()函数修改为min()函数。
CREATE OR REPLACE TABLE _tmp_t3 (id INT NOT NULL PRIMARY KEY);
INSERT INTO _tmp_t3 (id)
SELECT id
FROM t3
WHERE id NOT IN (
SELECT maxid FROM
(SELECT max(id) AS maxid FROM t3
GROUP BY f1, f2
) b
);
DELETE a FROM t3 as a INNER JOIN _tmp_t3 as b on b.id = a.id;
如果29秒可能会影响业务,可以做成存储过程,分批删除。
DELIMITER $$
DROP PROCEDURE IF EXISTS `usp_batch_delete`;
CREATE PROCEDURE `usp_batch_delete`(IN `batch_commit` int)
BEGIN
DECLARE i INT;
DECLARE num_count INT;
SET i = 1;
SELECT MAX(id) INTO num_count FROM _tmp_t3;
SET AUTOCOMMIT = 0;
WHILE i <= num_count DO
DELETE a FROM t3 as a INNER JOIN _tmp_t3 as b on b.id = a.id AND b.id = i;
SET i = i + 1;
IF MOD(1, batch_commit) >= 0 THEN
COMMIT;
END IF;
END WHILE;
SET AUTOCOMMIT = 1;
END; $$
DELIMITER ;
MariaDB删除重复记录性能测试的更多相关文章
- MariaDB删除重复记录
不管是程序BUG,还是业务变更,重复数据这个老生常谈的问题,总是会出现.以下是我在MariaDB或是MySQL下处理的一些经验.在SQL Server中,使用窗口函数是很容易实现的.不过听说MySQL ...
- mysql删除重复记录语句的方法
例如: id name value 1 a pp 2 a pp 3 b iii 4 b pp 5 b pp 6 c pp 7 c pp 8 c iii id是主键 要求得到这样的结果 id name ...
- mysql 删除重复记录语句
mysql 根据条件删除重复记录 只保留最小id的重复数据 DELETEFROM newsWHERE news_id IN ( SELECT a.news_id FROM ( SELECT news_ ...
- sql查询重复记录、删除重复记录方法大全
查找所有重复标题的记录:SELECT *FROM t_info aWHERE ((SELECT COUNT(*)FROM t_infoWHERE Title = a.Title) > 1)ORD ...
- mysql 数据表中查找、删除重复记录
为了性能考虑,在阅读之前提醒大家,如果有子查询,子查询查询到的数据最好不要超过总数据量的30%. 查询有重复数据的记录 select * from F group by a,b,c,d having ...
- [SQL]查询及删除重复记录的SQL语句
一:查询及删除重复记录的SQL语句1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断select * from peoplewhere peopleId in (select ...
- MySQL查询及删除重复记录的方法
查询及删除重复记录的方法(一)1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断select * from peoplewhere peopleId in (select p ...
- Oracle 查询并删除重复记录的SQL语句
查询及删除重复记录的SQL语句 1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断select * from peoplewhere peopleId in (select ...
- mysql插入数据与删除重复记录的几个例子(收藏)
mysql插入数据与删除重复记录的几个例子 12-26shell脚本实现mysql数据的批量插入 12-26mysql循环语句插入数据的例子 12-26mysql批量插入数据(insert into ...
随机推荐
- HDU1518 Square 【剪枝】
Square Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ...
- MFC小程序------01 代码管理器
1.代码入库: 2.代码查找: 3.查看全部代码: 4.程序设置: 自己学习MFC写的一个小程序,当中还有很多功能还待完好,比方数据库的导入功能还没有写,但导出功能是能够用的,查找算法也不是非常好,还 ...
- 用最简单的例子理解策略模式(Strategy Pattern)
当一个动作有多种实现方法,在实际使用时,需要根据不同情况选择某个方法执行动作,就可以考虑使用策略模式. 把动作抽象成接口,比如把玩球抽象成接口. public interface IBall { vo ...
- C#中数据库连接的几种方式
[转载]原文出处http://blog.163.com/ny_lonely/blog/static/188924273201161112931892/ 1.配置文件链接. 利用VS.NET开发平台 ...
- linux升级mysql到5.7
原文:http://blog.csdn.net/qing_gee/article/details/41774265 Linux升级MySQL版本到5.7. 1.下载Linux的5.7版本,主要需要两个 ...
- KJHttp框架使用讲解
摘要 本文原创,转载请注明地址:http://kymjs.com/code/2015/05/12/01写给那些在用.想用.还没有用过KJFrame的朋友. KJFrameForAndroid总共分为四 ...
- arcgis python 沿线生成点
# coding: utf-8 """ Source Name: generatepointsfromlines.py Version: ArcGIS 10.4/Pro ...
- 如何下载android源码与android内核源码
首先,要分清楚,android的源代码和android的内核代码一般是分开的,要分别进行下载. 1.先下载android的源代码.(这里不包括android的内核代码) 下载最新的源代码,一 ...
- 跟我学AngularJs:AngularJs入门及第一个实例
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:主要给大家介绍了AngularJs及其特性,并以3个实例来做说明. 本教程使用Angul ...
- 卡方检验(Chi-square test/Chi-Square Goodness-of-Fit Test)
什么是卡方检验 卡方检验是一种用途很广的计数资料的假设检验方法.它属于非参数检验的范畴,主要是比较两个及两个以上样本率( 构成比)以及两个分类变量的关联性分析.其根本思想就是在于比较理论频数和实际频数 ...