一 引子

在生产环境中,删除一个大文件,比如一个数十 G 或者上百 G 的文件是很耗时的。

本文介绍一个快速 DROP TABLE 的方法。使用本文提供的方法,不管该表数据量、占用空间有多大,都可以快速的删除。

下面做一个演示。

首先说明环境:

环境

由于我使用 mysql_multi 的形式启动 MySQL。所以我们需要在 MySQL 的配置文件 my.cnf 中加入 innodb_file_per_table 参数。

我的 my.cnf 配置如下:

[mysqld_multi]

mysqld = /usr/local/mysql/mysql-5.1.73-osx10.6-x86_64/bin/mysqld_safe

mysqladmin = /usr/local/mysql/mysql-5.1.73-osx10.6-x86_64/bin/mysqladmin

log = /var/log/mysqld_mutil.err

user = root

[mysqld5173]

port=5173

socket=/tmp/mysql_5173.sock

basedir=/usr/local/mysql/mysql-5.1.73-osx10.6-x86_64

datadir=/usr/local/mysql/data/5.1

user=_mysql

log-error=/var/log/mysqld_5173.log

pid-file=/tmp/mysqld_5173.pid

innodb_file_per_table

[mysqld5540]

port=5540

socket=/tmp/mysql_5540.sock

basedir=/usr/local/mysql/mysql-5.5.40-osx10.6-x86_64

datadir=/usr/local/mysql/data/5.5

user=_mysql

log-error=/var/log/mysqld_5540.log

pid-file=/tmp/mysqld_5540.pid

innodb_file_per_table

[mysqld5612]

port=5612

socket=/tmp/mysql_5612.sock

basedir=/usr/local/mysql/mysql-5.6.21-osx10.8-x86_64

datadir=/usr/local/mysql/data/5.6

user=_mysql

log-error=/var/log/mysqld_5612.log

pid-file=/tmp/mysqld_5612.pid

innodb_file_per_table

接着登录到 MySQL。

创建测试表。

说明:实验主要使用 city 表。user 表只是用于测试 LOAD DATA INFILE 的速度。

创建数据文本。

该文件包括 100W 行数据。内容如下:

1 “robin”,19,”M”,”GuangZhou”,”DBA”

……

1000000 “robin”,19,”M”,”GuangZhou”,”DBA”

该文件包括 1000W 行数据。内容如下:

1 “GuangZhou”,”GuangDong”,”GZ”,”Wechat”,”Netease”

……

10000000 “GuangZhou”,”GuangDong”,”GZ”,”Wechat”,”Netease”

编辑导入数据脚本。

该文件包括 10 行相同的导入数据命令。成功导入到 user 表后,会有 1000W 的数据。内容如下:

1 LOAD DATA INFILE ‘/tmp/user.txt’ \

INTO TABLE user \

FIELDS TERMINATED BY ‘,’ \

LINES TERMINATED BY ‘\n’;

……

10 LOAD DATA INFILE ‘/tmp/user.txt’ \

INTO TABLE user \

FIELDS TERMINATED BY ‘,’ \

LINES TERMINATED BY ‘\n’;

导入到 city 表的操作类似。

该文件包括 20 行相同的导入数据命令。成功导入到 city 表后,会有两亿条数据。内容如下:

1 LOAD DATA INFILE ‘/tmp/city.txt’ \

INTO TABLE city FIELDS \

TERMINATED BY ‘,’ \

LINES TERMINATED BY ‘\n’;

……

20 LOAD DATA INFILE ‘/tmp/city.txt’ \

INTO TABLE city FIELDS \

TERMINATED BY ‘,’ \

LINES TERMINATED BY ‘\n’;

导入数据到 MySQL。

其中导入到 user 表共耗时 84.63 秒。

接着导入数据到 city 表。

总共耗时:

共计 2394.30 秒,亦即 39.905 分钟。

我们查看数据目录,可以看到该表占用空间为 15G。

total 15699980

-rw-rw—- 1 _mysql _mysql 8.5K Jan 15 16:46 city.frm

-rw-rw—- 1 _mysql _mysql 15G Jan 15 17:33 city.ibd

删除表,耗时 1.08 秒。当然,这里数据量还不够大,所以速度还是挺快。

接下来,我们重新创建表,导入数据。

导入数据耗时跟之前相差不多,不做计算。

创建硬链接。

total 15699980

-rw-rw—- 1 _mysql _mysql 8.5K Jan 15 17:35 city.frm

-rw-rw—- 1 _mysql _mysql 15G Jan 15 18:13 city.ibd

total 31399948

-rw-rw—- 1 _mysql _mysql 8.5K Jan 15 17:35 city.frm

-rw-rw—- 2 _mysql _mysql 15G Jan 15 18:13 city.ibd

-rw-rw—- 2 _mysql _mysql 15G Jan 15 18:13 city.ibd.hl

可以看到,iNode 由 1 变为 2。

再次删除。

最后,把硬链接文件删除。

total 15699968

-rw-rw—- 1 _mysql _mysql 15G Jan 15 18:13 city.ibd.hl

第一次删除,耗时 1.08 秒。第二次,建立硬链接后,删除表耗时 0.90 秒。两次删除表耗时差异不是太明显,那是因为我的数据只有 15 G。如果在生产环境中,数据量达到数十 G、上百 G、甚至 T 级,就会显示这种方法的威力了。本来打算模拟出 100 G 的数据,但由于机器配置和时间关系,就没有做了。

PS:两次插入数据,每次 两亿,已经耗去我 1 个多小时的时间。时间宝贵啊,不在这里浪费了。

本文中快速 DROP TABLE 利用了操作系统的 Hard Link(硬链接) 的原理。当多个文件名同时指向同一个 iNode 时,这个 iNode 的引用数 N > 1,删除其中任何一个文件名都会很快。因为其直接的物理文件块没有被删除,只是删除了一个指针而已;当 iNode 的引用数 N = 1 时,删除文件需要去把这个文件相关的所有数据块清除,所以会比较耗时。

最后,吐槽下 Windows。这次测试环境为 Mac OS X 10.9.5,i5,8G 内存。vim 打开一个 458 M 的文本,只需要数秒(N

截个图给读者欣赏欣赏。

Enjoy!

–EOF–

mysql drop 几十g的表_MySQL Drop 大表的解决方案相关推荐

  1. mysql truncate 大表_MySQL删除大表时潜在的问题(drop table,truncate table)

    case1,删除大表时,因为清理自适应hash索引占用的内容导致的MySQL服务挂起 case2,大表的随意Drop或者truncate导致MySQL服务的挂起 按照本文中的结论就是 MySQL5.6 ...

  2. SparkSql MAPJOIN优化之小表left join大表

    首先我们要了解MAPJOIN优化原理,这里简要说明下 Spark Broadcast hash join(Hive map join同理) 1,把小表广播到所有大表分布的节点上,在每个节点上分别进行单 ...

  3. mysql存储引擎静态表_MySQL存储引擎(表类型)的选择

    一.MySQL存储引擎概述 MySQL与多数数据库不同的是包含存储引擎这一特性,用户可以根据应用的需要选择合适的存储引擎来使存储和索引数据,以及是否使用事务等.MySQL5.0支持的存储引擎包括MyI ...

  4. mysql数据库操作宠物表_mysql数据库及表的基本操作

    1. 数据库操作 1.1 创建数据库 # 创建数据库 mysql> create database db_test; # 查看创建好的数据库 mysql> show create data ...

  5. MySQL导入几十G数据后创建索引时提示空间不足(Errcode: 28 - No space left on device)

    本周用ETL工具进行一系列数据入库操作,涉及到一些上几十G的大表的时候,总是会出现异常:Errcode: 28 - No space left on device. [load data local ...

  6. mysql创建销售表_MySQL创建数据表(CREATE TABLE语句)

    在创建数据库之后,接下来就要在数据库中创建数据表.所谓创建数据表,指的是在已经创建的数据库中建立新表. 创建数据表的过程是规定数据列的属性的过程,同时也是实施数据完整性(包括实体完整性.引用完整性和域 ...

  7. 删除mysql表_Mysql 删除数据表的三种方式详解

    用法: 1.当你不再需要该表时, 用 drop; 2.当你仍要保留该表,但要删除所有记录时, 用 truncate; 3.当你要删除部分记录或者有可能会后悔的话, 用 delete. 删除程度可从强到 ...

  8. java mysql 清空表_MySQL 删除数据表

    MySQL 删除数据表 MySQL中删除数据表是非常容易操作的, 但是你再进行删除表操作时要非常小心,因为执行删除命令后所有数据都会消失. 语法 以下为删除MySQL数据表的通用语法: DROP TA ...

  9. mysql从库执行delete停止_MySQL主库大表执行delete语句,Ctrl+C具体发生了什么分析...

    MySQL主库大表执行delete语句,Ctrl+C具体发生了什么分析 1.查看表结构 localhost.qt>show create table doctor_stats_backup\G ...

最新文章

  1. 2008年上半年 网络工程师 上下午试卷【附带答案】
  2. Linux下Gedit + Gmate ,实用的编辑器
  3. sql查询时间大于某一时间_查询时间从24分钟到2秒钟:记一次神奇的SQL优化
  4. java 010_Java笔记-day010-[String类]
  5. win8.1适合哪个版本的linux,紧跟Win8 全面体验最适合国人的深度Linux
  6. Java——类加载机制
  7. 聊聊composer.lock
  8. python3 实现对比conf 文件差异
  9. flask send_filesend_from_directory
  10. 转:PHP程序里的敏感信息处理方法
  11. Alfred 4 for Mac(应用快速启动器)
  12. 计算机网络安全工作台账,网络安全工作自查报告(2)
  13. 伍德里奇 第6版 计量经济学导论_伍德里奇《计量经济学导论》第6版课后习题答案...
  14. 涉密计算机用户密码操作规程,涉密计算机管理设置密码
  15. Windows:在Windows下创建并删除软连接
  16. html5 video js 播放,H5播放HLS之videojs播放视频
  17. Python+Selenium自动化测试——126邮箱自动登录脚本(登录首页是二维码,切入账号密码输入框)
  18. java linest_java基础:学生管理系统
  19. androID程序!BAT大厂面试基础题集合,附带学习经验
  20. XBox360-双光盘游戏自制GOD

热门文章

  1. 学习计划Current(2019.4.23)
  2. cuSPARSE库:(四)不同矩阵格式在内存中的存储方式
  3. AMD: Developer Guides, Manuals ISA Documents
  4. LIB BFD, the Binary File Descriptor Library
  5. ATK插件化开发:AtkPlug,AtkSocket
  6. 【HTML+CSS网页设计与布局 从入门到精通】第3章
  7. OpenCV学习笔记:视频处理
  8. python绘制矩形图_Python。在底图中绘制矩形
  9. dsge模型难做吗_百度Seo优化好做吗,现在做是不是越来越难做?
  10. 7收不到邮件 contact form_Contact Form 7基本使用教程