mysql - 从 MySQL 数据库中删除数百万行的最快方法是什么?
问题描述
我的数据库空间不足,所以我对旧记录进行了备份。现在我要清除这些记录,我的参考栏是“日期”。
我尝试使用标准方法:
DELETE FROM table WHERE date >= '2017-01-01' AND date <= '2017-12-31'
但这显然花费了太多时间,因为要删除的行数超过 700 万行。有没有办法加快这个速度?我试图分成几个月甚至更小的块,但是在运行代码一段时间后,我与服务器断开连接。
提前致谢。
编辑:
CREATE TABLE table (
id INT(11) NOT NULL AUTO_INCREMENT,
date DATE DEFAULT NULL,
# 18 more columns
PRIMARY KEY (id)
)
ENGINE = INNODB,
AUTO_INCREMENT = 29616055,
AVG_ROW_LENGTH = 317,
CHARACTER SET utf8mb4,
COLLATE utf8mb4_general_ci;
解决方案
如果您有足够的空间,则创建一个临时表并重新加载原始表:
create table temp_t as
select *
from table
where date >= '2018-01-01';
truncate table t;
insert into t
select *
from temp_t;
这节省了所有的日志记录开销delete
——这可能非常昂贵。
接下来,您需要了解分区。这使得该过程更加简单。您可以只删除一个分区,而不是删除行——并且没有用于删除分区的逐行日志记录。
推荐阅读
- julia - 如何评估 Julia 一行中第一个罪恶情节的启动 + 执行时间?
- docker - 根据DB动态运行Docker容器?
- docusignapi - 从我们的平台创建模板和设计,而不是登录到docusign
- react-native - 从第一页按钮单击后如何在下一页的图标上显示计数增量值
- angular - 只有一个按钮可以处于“NO”状态
- jquery - 如何在 Dropzone 中仅上传单个图像来创建文件上传器
- vuex - vuex 重复命名空间 auth/ 用于命名空间模块 auth
- c# - Entity Framework 6 - 查询性能
- steam - steamcmd自动启动游戏
- python - python 3.7 包真的不需要 __init__.py 吗?