这是学习笔记的第 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平滑删除数据的小技巧相关推荐

  1. mysql 释放空间_Mysql InnoDB删除数据后释放磁盘空间的步骤详解

    Mysql InnoDB删除数据后释放磁盘空间的方法 Innodb数据库对于已经删除的数据只是标记为删除,并不真正释放所占用的磁盘空间,这就导致InnoDB数据库文件不断增长. 如果在创建数据库的时候 ...

  2. MySQL添加、更新、删除数据

    MySQL添加.更新.删除数据 1.查询数据 select * from student; 2.添加数据 insert into student values(1,"张三",&qu ...

  3. mysql删除新添加数据,MySQL添加、更新与删除数据

    添加.更新与删除数据 添加数据 为表中所有字段添加数据 INSERT INTO 表名(字段名1,字段名2,--) VALUES(值1,值2,--); insert into 表名 values(值1, ...

  4. MySQL 添加、更新和删除数据

    一.添加数据 在MySQL中使用INSERT添加数据分为: 为表中所有字段添加数据 为表的指定字段添加数据 同时添加多条数据 1.为表中所有字段添加数据 使用insert的MySQL语句为: INSE ...

  5. phpstudy mysql建表_MySQL_总结MySQL建表、查询优化的一些实用小技巧,MySQL建表阶段是非常重要的一 - phpStudy...

    总结MySQL建表.查询优化的一些实用小技巧 MySQL建表阶段是非常重要的一个环节,表结构的好坏.优劣直接影响着后续的管理维护,赶在明天上班前分享总结个人MySQL建表.MySQL查询优化积累的一些 ...

  6. 怎样将PDF水印删除 PDF删除水印的小技巧

    当大家在工作中想要使用别人的PDF文件模板时,都只能选择放弃.因为他人的PDF文件模板中都带有水印,根本无法拿来进行编辑.修改. 在大家看到精致的PDF文件排版,漂亮的图片时都想借鉴使用.可就因为小小 ...

  7. mysql如何删除数据_MySQL中删除数据的两种方法

    1. 在MySQL中有两种方法可以删除数据: 一种是delete语句,另一种是truncate table语句. delete语句可以通过where对要删除的记录进行选择,而使用truncate ta ...

  8. cass道路道路设计参数文件命令为什么没反应_为什么MySQL不建议使用delete删除数据?...

    前言 我负责的有几个系统随着业务量的增长,存储在MySQL中的数据日益剧增,我当时就想现在的业务方不讲武德,搞偷袭,趁我没反应过来把很多表,很快,很快啊都打到了亿级别,我大意了,没有闪,这就导致跟其J ...

  9. ubuntu mysql 更新_数据库应用(三): Ubuntu 下 MySQL添加、更新与删除数据

    添加.更新与删除数据 1.添加数据 命令格式: INSERT|replace INTO 表名(字段名1,字段名2,--) VALUES(值1,值2,--), (值1,值2,--); 需要注意:使用in ...

最新文章

  1. 笔试编程常用函数(Java)
  2. “Spring入门”教程系列
  3. elasticsearch和php,快速开始 | Elasticsearch-PHP | Elastic
  4. Windows破解笔记-windows API中的SendMessage
  5. C++中若类中没有默认构造函数,如何使用对象数组
  6. Android之使用AlertDialog.Builder类创建带列表的对话框和带自己所布局视图的对话框
  7. WPF、Authorware和Flash
  8. 华为机试HJ32:密码截取
  9. 苹果Mac电脑配置flutter开发环境
  10. c#整数数字转汉字一二三四五
  11. 商务与经济统计 第三章案例
  12. matlab空间计量AIC准则,空间计量经分析课件.ppt
  13. 计算机仿真和vr的区别,扫盲科普:今天才知道VR和AR的区别
  14. Eclipse绿豆沙护眼
  15. Java总结IO篇之字符流
  16. CAT 实时监控与项目集成
  17. SPI MOSI和MISO 相位不同
  18. 块矩阵(Block Matrix)、舒尔补(Schur complement)
  19. Python Flask项目部署
  20. 怎么理解幂等性[或者http幂等性]

热门文章

  1. 作为一个前端,可以如何机智地弄坏一台电脑?
  2. Android项目:使用pulltorefresh开源项目扩展为下拉刷新上拉加载更多的处理方法,监听listview滚动方向...
  3. 《CCNP TSHOOT(642-832)学习指南》一导读
  4. 一个好用的ODBC数据库类CMYODBC
  5. zephyr 测试框架
  6. python遇到Retry(total=4, connect=None, read=None, redirect=None, status=None)解决方案
  7. django models索引_django-models – Django模型“IndexError:列表索引超出范围”Pydev
  8. idea 升级到2020后 无法启动_i.MXRT软复位后无法从32MB Flash启动?
  9. LINUX检测服务并自动运行,一种Linux下的开机自动检测硬件信息的方法与流程
  10. java同步异步调用_详解java 三种调用机制(同步、回调、异步)