IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 【Mysql】如何删除百万条以上数据 -> 正文阅读

[大数据]【Mysql】如何删除百万条以上数据

当数据库内的数据达到百万甚至千万条数的时候,直接DELETE FROM tablename 可能会耗费非常久的时间。
所以这里提供我实际使用的方法,可能不是最合适的方法,后续有更好的方法会进行补充。

方法一 TRUNCATE TABLE

通过TRUNCATE TABLE 来删除表中百万条数据的情况

  1. 创建临时表备份数据
    比如我只想保留2022.05.13号的数据,其他之前的数据都删除。
SELECT id FROM tablename WHERE report_time > '2022-05-13' LIMIT 1;

得到ID = 4109823;

CREATE TABLE tablename_old SELECT * FROM tablename WHERE id > 4109823;

创建临时表tablename_old 存放’2022-05-13’的数据。

  1. 截断表
TRUNCATE TABLE tablename ;
  1. 备份的数据插入到表中
INSERT INTO tablename  SELECT * FROM tablename_old ;

可能出现的问题:
执行 TRUNCATE TABLE 可能会出现Waiting for table metadata lock 锁表解决方案
解决方法:
1.登录数据库 执行 SHOW PROCESSLIST;
2.select * from information_schema.innodb_trx\G; 查询当前事务,里面会出现:trx_mysql_thread_id进程ID。
3.kill 进程ID; 杀死当前进程

注:
1、此方法的表内没有设置“索引”,如果是有索引的表,建议先删除索引,再开始删除表中数据。
2、mysql临时表,属于session级别,当session退出时,临时表被删除。也就是说,临时表将在你连接mysql期间存在。当断开时,mysql将自动删除表并释放所用的空间。当然你可以在仍然连接的时候删除表并释放空间。
3、TRUNCATE TABLE 不能用于参与了索引视图的表

方法二 循环遍历删除

创建存储过程循环遍历删除,此处按日期举例:

DROP PROCEDURE IF EXISTS `_DELETE_TABLE_BY_DAY_`;

CREATE PROCEDURE `_DELETE_TABLE_BY_DAY_`(IN `_Sql_name` varchar(64),IN `_Begin_date` date,IN `_End_date` date)
BEGIN
	#Routine body goes here...
	DECLARE _datetmp DATE;
	#DECLARE _dates DATE;
	DECLARE _sql_for_delete varchar(500); -- 定义预处理sql语句 

	SET _datetmp = _Begin_date;
	SET @_dates = _Begin_date;
	SET @_EndT = (DATE_ADD(_End_date, INTERVAL 1 DAY));	-- BETWEEN AND -> 范围 [_Begin_date, _End_date)
	
	-- 查询符合条件的个数
	SET _sql_for_delete = (CONCAT("SELECT COUNT(*) FROM ",_Sql_name," WHERE report_time BETWEEN ? AND ?")); -- 拼接查询sql语句
	SET @sqls = _sql_for_delete;
	PREPARE stmt FROM @sqls; -- 预处理动态sql语句
	EXECUTE stmt USING @_dates, @_EndT; -- 执行sql语句
	DEALLOCATE PREPARE stmt; -- 释放prepare 

	WHILE @_dates <= _End_date DO
		SET _sql_for_delete = (CONCAT("DELETE FROM ",_Sql_name," WHERE TO_DAYS(report_time) = TO_DAYS(?)")); -- 拼接查询sql语句
		SET @sqls = _sql_for_delete;
		PREPARE stmt FROM @sqls; -- 预处理动态sql语句
		EXECUTE stmt USING @_dates; -- 执行sql语句
		DEALLOCATE PREPARE stmt; -- 释放prepare 

		SET @_dates = (DATE_ADD(_datetmp, INTERVAL 1 DAY));
		SET _datetmp = @_dates;
	END WHILE;

END;


此过程为按照日期删除指定表内的数据,可以以此为参照,写出按月删除等。
这边再附上一个按日期查询的相关语句
查询当天的数据

select * from 表名 where TO_DAYS(时间字段)=TO_DAYS(NOW());

查询当周的数据

select * from 表名 where YEARWEEK(DATE_FORMAT(时间字段,%Y-%m-%d’))=YEARWEEK(NOW());

查询当月的数据

select * from 表名 where DATE_FORMAT(时间字段,%Y-%m’)=DATE_FORMAT(CURDATE(),%Y-%m’);

查询昨天的数据

select * from 表名 where TO_DAYS(NOW())-TO_DAYS(时间字段)=1;

查询最近7天的数据

select * from 表名 where DATE_SUB(CURDATE(),INTERVAL 7 DAY)<=DATE(时间字段);

查询当年的数据

select * from 表名 where YEAR(时间字段) =YEAR(NOW());

查询上周的数据

select * from 表名 whereYEARWEEK(DATE_FORMAT(时间字段,%Y-%m-%d’))=YEARWEEK(NOW())-1;

查询上月的数据

select *from 表名 where PERIOD_DIFF(DATE_FORMAT(NOW(),%Y-%m’),DATE_FORMAT(时间字段,%Y-%m’))=1;

注意:

  1. 存储动态SQL的值的变量不能是自定义变量,必须是用户变量或者全局变量 如:set sql = 'xxx'; prepare stmt from sql;是错的,正确为: set @sql = 'xxx'; prepare stmt from @sql;
  2. 即使 preparable_stmt 语句中的 ? 所代表的是一个字符串,你也不需要将 ? 用引号包含起来。
  3. 如果动态语句中用到了 in ,正常写法应该这样:select * from table_name t where t.field1 in (1,2,3,4,...);则sql语句应该这样写:set @sql = "select * from user where user_id in (?,?,?) "
  4. 如果不确定有几个?,可以用find_in_set函数,例如:
select * from table_name t where find_in_set(t.field1,'1,2,3,4');

参考文档1:mysql数据库快速删除千万级数据
参考文档2:MySQL根据日期查询

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-05-21 19:02:54  更:2022-05-21 19:03:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 20:58:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码