MySQL平滑删除数据的小技巧【转】
今天接到一位开发同学的数据操作需求,需求看似很简单,需要执行下面的SQL语句:
delete from test_track_log where log_time < '2019-1-7 00:00:00';
看需求描述是因为查询统计较差,希望删除一些历史数据。
带着疑问我看下了表结构:
CREATE TABLE `test_track_log` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键', `uid` int(11) unsigned NOT NULL DEFAULT '' COMMENT '用户ID', ... `log_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '记录时间', PRIMARY KEY (`id`), KEY `idx_uid_fsm_log` (`uid`,`fsm_id`,`log_time`) ) ENGINE=InnoDB AUTO_INCREMENT=125082604 DEFAULT CHARSET=utf8 COMMENT='记录测试账号的任务轨迹'
看自增列的情况,这个表的数据量有近1亿条记录了,暂且不说数据量带来的额外影响,单说这个需求,你会发现这是一个陨石坑。
简单验证了下,数据量确实在亿级别。
select count(id) from tgp_db.tgp_track_log +-----------+ | 125082603 | +-----------+ 1 row in set (1 min 26.63 sec)
如果老老实实执行了,估计我下午就不用干别的了。
显然这个需求是一个模糊需求,业务方希望清理数据,但是实现方式缺不合理。
如果我们使用truncate的操作,这样看来目前是比较合适的。
同时在做数据清理的时候,势必要考虑备份数据,而和业务方确认,数据可以不用备份,但是从数据库层面来说,是需要的。
在操作前进行细致的沟通,发现业务方还是会希望参考近些天来的数据,尤其是当天的数据,所以这个操作还是需要谨慎。
这里有两个坑:
第一是业务方再三确认不需要备份,但是如果删除了数据之后,发生了意料之外的故障,需要恢复数据,而DBA没法恢复,那么这个锅我们背不住。
第二是业务方再三确认删除的逻辑是正确的,但是他们不负责数据操作的性能问题,我们如果不去审核而为了执行而执行,那么造成性能故障之后,很容易造成需求的分歧。
所以这件事情的本质很简单,清理数据,对业务影响最小,保留指定范围的数据。
这种情况下单纯的DML语句是搞不定了,我们需要想一些办法,这里有一个技巧,也是我非常喜欢MySQL的一个亮点特性,即MySQL可以很轻松的把一个库的表迁移到另外一个数据库,这种操作的代价就好像把一个文件从文件夹1拷贝到文件夹2。
一个初版的实现如下:
create table test_db.test_track_log_tmp like test_db.test_track_log; alter table test_db.test_track_log rename to test_db_arch.test_track_log; alter table test_db.test_track_log_tmp rename to test_db.test_track_log;
这种操作看起来很简单,但是也存在一些问题,一个是在切换的过程中,如果写入数据是会丢失数据的,即数据已经入库,这里通过rename丢失数据。
第二个是这个操作不够简洁。怎么改进呢,我们可以把rename的操作玩得更溜。
mysql> create table test_db_arch.test_track_log like test.test_track_log; mysql> RENAME TABLE test.test_track_log TO test_db_arch.test_track_log_bak, test_db_arch.test_track_log TO test.test_track_log, test_db_arch.test_track_log_bak TO test_db_arch.test_track_log; Query OK, 0 rows affected (0.02 sec)
整个过程持续0.02秒,亿级数据的切换,整体来说效果还是很明显的,也推荐大家在工作中根据适合的场景来应用。
转自
MySQL平滑删除数据的小技巧 https://www.toutiao.com/a6643787647217041924/?tt_from=mobile_qq&utm_campaign=client_share×tamp=1547273084&app=news_article&utm_source=mobile_qq&iid=26112390770&utm_medium=toutiao_ios&group_id=6643787647217041924
MySQL平滑删除数据的小技巧【转】的更多相关文章
- mysql优化, 删除数据后物理空间未释放(转载)
mysql优化, 删除数据后物理空间未释放(转载) OPTIMIZE TABLE 当您的库中删除了大量的数据后,您可能会发现数据文件尺寸并没有减小.这是因为删除操作后在数据文件中留下碎片所致.OPTI ...
- mysql 使用的三个小技巧
mysql 使用的三个小技巧 快速阅读 Mysql查询工具中如何查询多条语名,Mysql中如何设置变量,Mysql中如何查特定字段,后面再加* Mysql查询工具中如何查询多条语名 默认myslq只能 ...
- mysql 在删除数据出现Cannot delete or update a parent row: a foreign key constraint fails 这个该如何解决
mysql 在删除数据出现Cannot delete or update a parent row: a foreign key constraint fails 这个该如何解决 可以这样解决: S ...
- Mysql编写sql语句的小技巧
1.查询数据(保证查询性能) SELECT * 和 SELECT t.id , t.name:后者性能其实总体优于前者. 2.在查询的时候最好给表起个 别名,方便找到表中要查询的字段.执行sql的进行 ...
- 工作中MySql的了解到的小技巧
工作中MySql的小技巧 1. 跑脚本时,经常遇到有则更新无插入的 逻辑操作:通常情况下,来一波if()判断然后选择 更新还是插入,前两天逛论坛时发现有人在比较REPLACE INTO 和 INSET ...
- mysql避免数据库误操作小技巧(转)
避免混淆开发环境的DB和生产环境的DB这在小公司小团队尤其常见.一个人即负责开发,又管DB.桌面上开了一坨终端,有的是开发的DB,有的是生产的DB.一不留神,就写串了,或者粘贴串了.更郁闷的是,有时候 ...
- MySQL数据库删除数据(有外键约束)
在MySQL中删除一张表或一条数据的时候,出现有外键约束的问题,于是就去查了下方法: SELECT @@FOREIGN_KEY_CHECKS; 查询当前外键约束是否打开 ; 设置为1的时候外键约束是打 ...
- MySQL中删除数据的两种方法
转自:http://blog.csdn.net/apache6/article/details/2778878 1. 在MySQL中有两种方法可以删除数据: 一种是delete语句,另一种是trunc ...
- 【MYSQL】删除数据后自动增长列归0的问题
在清空数据表后发现自动增长id列在新增数据后仍然会按照之前的顺序生成 强迫症,就是想清空数据后让id从0开始,于是百度 执行以下sql语句可以让自动增长列归0 truncate table 表名 这是 ...
随机推荐
- Java面试准备之JVM
介绍JVM中7个区域,然后把每个区域可能造成内存的溢出的情况说明 程序计数器:看做当前线程所执行的字节码行号指示器.是线程私有的内存,且唯一一块不报OutOfMemoryError异常. Java虚拟 ...
- LoadRunner 压力测试使用基础步骤
一.新建脚本 二.新建脚本-选择协议,这里选择Web (HTTP/HTML) 三.开始录制(指定程序与URL) 四.场景设计(设计虚拟用户访问场景) 五.运行情况(可以看到运行结果) 六.分析报告(总 ...
- 如何将多个C文件链接在一起----Makefile编写及make指令
需使用GCC编译器,关于MinGW的安装指南:https://people.eng.unimelb.edu.au/ammoffat/teaching/20005/Install-MinGW.pdf 单 ...
- 其它综合-企业级CentOS 7.6 操作系统的安装
企业级CentOS 7.6版本安装过程 1. 环境: 使用的虚拟机软件是VMware,版本为 12 .(网上一搜一大推,在此不再演示.) 使用的ISO镜像为CentOS7.6.(自己也可以在网上搜镜像 ...
- CDH 集群机器上部署 Jupyter notebook 使用 Pyspark 读取 Hive 数据库
开始直接在 CDH Pyspark 的环境里面运行 Ipython . spark = SparkSession \ .builder \ .master('yarn') \ .appName('md ...
- Java多线程10:join()方法
一.前言 通过一个简单的例子引入join()方法 public class Thread01 extends Thread{ @Override public void run() { for(int ...
- Redis的发布与订阅
业务: 运用数据与信息指导小药工的采购生产与销售行为 需求背景: (1)药工汇小程序用户(即小型中药初加工用户)需要知道自己加工的品种的价格涨跌信息和品种相关资讯) 需求分析拆解: (1)使用爬虫程序 ...
- bzoj3527: [Zjoi2014]力 卷积+FFT
先写个简要题解:本来去桂林前就想速成一下FFT的,结果一直没有速成成功,然后这几天断断续续看了下,感觉可以写一个简单一点的题了,于是就拿这个题来写,之前式子看着别人的题解都不太推的对,然后早上6点多推 ...
- Stanford Local 2016 E "Election of Evil"(搜索(正解)或并查集(划掉))
传送门 题意: 给出集合U,V,集合U有n个元素,集合V有m个元素: 有 m 个操作,mi : s1 s2 有一条s1指向s2的边(s1,s2可能属于第三个集合,暂且称之为K集合): 指向边具有传递性 ...
- python格式化输出的几种方式
第一种 字符串拼接 就不写了 下面的是 第二 第三 第四种 name = input("name:") age = int(input("age:")) p ...