mysql平滑关闭_MySQL平滑删除数据的小技巧
这是学习笔记的第 1852篇文章
今天接到一位开发同学的数据操作需求,需求看似很简单,需要执行下面的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 '0' 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=125082604DEFAULT 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秒,亿级数据的切换,整体来说效果还是很明显的,也推荐大家在工作中根据适合的场景来应用。
本文仅代表作者个人观点,不代表SEO研究协会网官方发声,对观点有疑义请先联系作者本人进行修改,若内容非法请联系平台管理员,邮箱cxb5918@163.com。更多相关资讯,请到SEO研究协会网www.seoxiehui.cn学习互联网营销技术请到巨推学院www.jutuiedu.com。
mysql平滑关闭_MySQL平滑删除数据的小技巧相关推荐
- mysql 释放空间_Mysql InnoDB删除数据后释放磁盘空间的步骤详解
Mysql InnoDB删除数据后释放磁盘空间的方法 Innodb数据库对于已经删除的数据只是标记为删除,并不真正释放所占用的磁盘空间,这就导致InnoDB数据库文件不断增长. 如果在创建数据库的时候 ...
- MySQL添加、更新、删除数据
MySQL添加.更新.删除数据 1.查询数据 select * from student; 2.添加数据 insert into student values(1,"张三",&qu ...
- mysql删除新添加数据,MySQL添加、更新与删除数据
添加.更新与删除数据 添加数据 为表中所有字段添加数据 INSERT INTO 表名(字段名1,字段名2,--) VALUES(值1,值2,--); insert into 表名 values(值1, ...
- MySQL 添加、更新和删除数据
一.添加数据 在MySQL中使用INSERT添加数据分为: 为表中所有字段添加数据 为表的指定字段添加数据 同时添加多条数据 1.为表中所有字段添加数据 使用insert的MySQL语句为: INSE ...
- phpstudy mysql建表_MySQL_总结MySQL建表、查询优化的一些实用小技巧,MySQL建表阶段是非常重要的一 - phpStudy...
总结MySQL建表.查询优化的一些实用小技巧 MySQL建表阶段是非常重要的一个环节,表结构的好坏.优劣直接影响着后续的管理维护,赶在明天上班前分享总结个人MySQL建表.MySQL查询优化积累的一些 ...
- 怎样将PDF水印删除 PDF删除水印的小技巧
当大家在工作中想要使用别人的PDF文件模板时,都只能选择放弃.因为他人的PDF文件模板中都带有水印,根本无法拿来进行编辑.修改. 在大家看到精致的PDF文件排版,漂亮的图片时都想借鉴使用.可就因为小小 ...
- mysql如何删除数据_MySQL中删除数据的两种方法
1. 在MySQL中有两种方法可以删除数据: 一种是delete语句,另一种是truncate table语句. delete语句可以通过where对要删除的记录进行选择,而使用truncate ta ...
- cass道路道路设计参数文件命令为什么没反应_为什么MySQL不建议使用delete删除数据?...
前言 我负责的有几个系统随着业务量的增长,存储在MySQL中的数据日益剧增,我当时就想现在的业务方不讲武德,搞偷袭,趁我没反应过来把很多表,很快,很快啊都打到了亿级别,我大意了,没有闪,这就导致跟其J ...
- ubuntu mysql 更新_数据库应用(三): Ubuntu 下 MySQL添加、更新与删除数据
添加.更新与删除数据 1.添加数据 命令格式: INSERT|replace INTO 表名(字段名1,字段名2,--) VALUES(值1,值2,--), (值1,值2,--); 需要注意:使用in ...
最新文章
- 笔试编程常用函数(Java)
- “Spring入门”教程系列
- elasticsearch和php,快速开始 | Elasticsearch-PHP | Elastic
- Windows破解笔记-windows API中的SendMessage
- C++中若类中没有默认构造函数,如何使用对象数组
- Android之使用AlertDialog.Builder类创建带列表的对话框和带自己所布局视图的对话框
- WPF、Authorware和Flash
- 华为机试HJ32:密码截取
- 苹果Mac电脑配置flutter开发环境
- c#整数数字转汉字一二三四五
- 商务与经济统计 第三章案例
- matlab空间计量AIC准则,空间计量经分析课件.ppt
- 计算机仿真和vr的区别,扫盲科普:今天才知道VR和AR的区别
- Eclipse绿豆沙护眼
- Java总结IO篇之字符流
- CAT 实时监控与项目集成
- SPI MOSI和MISO 相位不同
- 块矩阵(Block Matrix)、舒尔补(Schur complement)
- Python Flask项目部署
- 怎么理解幂等性[或者http幂等性]
热门文章
- 作为一个前端,可以如何机智地弄坏一台电脑?
- Android项目:使用pulltorefresh开源项目扩展为下拉刷新上拉加载更多的处理方法,监听listview滚动方向...
- 《CCNP TSHOOT(642-832)学习指南》一导读
- 一个好用的ODBC数据库类CMYODBC
- zephyr 测试框架
- python遇到Retry(total=4, connect=None, read=None, redirect=None, status=None)解决方案
- django models索引_django-models – Django模型“IndexError:列表索引超出范围”Pydev
- idea 升级到2020后 无法启动_i.MXRT软复位后无法从32MB Flash启动?
- LINUX检测服务并自动运行,一种Linux下的开机自动检测硬件信息的方法与流程
- java同步异步调用_详解java 三种调用机制(同步、回调、异步)