MySQL中删除大表的性能问题

微博上讨论MySQL在删除大表engine=innodb(30G+)时,如何减少MySQL hang的时间,现做一下简单总结:(微博地址:http://weibo.com/1642466057/yuPz2guYJ)

当buffer_pool很大的时候(30G+),由于删除表时,会遍历整个buffer pool来清理数据,会导致MySQL hang住,解决的办法是:

1、当innodb_file_per_table=0的时候,以上不是问题,因为采用共享表空间的时候,该表所占用的空间不会被删除,buffer pool中的相关页不会 被discard。

2、当innodb_file_per_table=1的时候,并且当buffer_pool比较大的时候,遍历整个buffer pool 需要很多的时间(table_cache 会被锁住,所有的DML操作被阻止)。

认识误区:

将innodb 表改为 myisam表,这个是没有效果的,该操作会删除旧表,建立新表,依然会遍历整个buffer_pool。

解决思路:

1、采用脚本形式,批量删除部分记录

2、可以再slave上进行操作,进行主备切换(成本高)

3、Percona 5.1.58以上版本都支持innodb_lazy_drop_table(bug不少,慎用)

4、与buffer pool无关,但是可以加快 删除数据文件的速度,同样能减少MySQL hang住的时间。即:对数据文件建立硬链接,(依赖原理:OS HARD LINK  当多个文件名同时指向同一个INODE时,这个INODE的引用数N>1, 删除其中任何一个文件名只是删除了一个指针而已,不会删除数据文件。当INODE的引用数N=1时, 删除文件需要去把这个文件相关的所有数据块清除,所以会比较耗时)  

参考链接:

http://www.bianceng.cn/database/MySQL/

http://www.mysqlops.com/2011/05/18/mysql%E5%88%A0%E9%99%A4%E5%A4%A7%E8%A1%A8%E6%9B%B4%E5%BF%AB%E7%9A%84drop-table%E5%8A%9E%E6%B3%95.html

http://www.mysqlperformanceblog.com/2011/02/03/performance-problem-with-innodb-and-drop-

http://www.mysqlsky.com/201211/large-tbl-drop

时间: 2024-11-30 14:51:01

MySQL中删除大表的性能问题的相关文章

MySQL 删除大表的性能问题解决方案_Mysql

微博上讨论MySQL在删除大表engine=innodb(30G+)时,如何减少MySQL hang的时间,现做一下简单总结: 当buffer_pool很大的时候(30G+),由于删除表时,会遍历整个buffer pool来清理数据,会导致MySQL hang住,解决的办法是: 1.当innodb_file_per_table=0的时候,以上不是问题,因为采用共享表空间的时候,该表所占用的空间不会被删除,buffer pool中的相关页不会 被discard. 2.当innodb_file_pe

Mysql 如何 删除大表

[问题隐患]     由于业务需求不断变化,可能在DB中存在超大表占用空间或影响性能:对这些表的处理操作,容易造成mysql性能急剧下降,IO性能占用严重等.先前有在生产库drop table造成服务不可用:rm 大文件造成io跑满,引发应用容灾:对大表的操作越轻柔越好.     [解决办法]     1.通过硬链接减少mysql DDL时间,加快锁释放     2.通过truncate分段删除文件,避免IO hang     [生产案例]     某对mysql主备,主库写入较大时发现空间不足

mysql中alter数据表中增加、删除字段与表名修改例子

 alter是非常强大的一个功能我们可以利用alter来修改数据表表名字体名及一些其它的操作了,下面一起来看看mysql中alter数据表中增加.删除字段与表名修改的一个例子.     修改删除mysql数据库中的数据内容: [root@hk ~]# /usr/local/mysql/bin/mysql -uroot -p'admin' #进入mysql mysql> create database gbk default character set gbk collate gbk_chines

如何删除大表中的数据

通常我们认为truncate和drop都是ddl语句,都会释放表占用的空间,且不可回退;而他们的之间的区别在于我们平时忽略的reuse/drop storage子句. reuse storage不会立即释放表的extent,我们可以先使用truncate table tableName reuse storage,然后分批释放表的extent.这在删除大表时非常有用,避免大量的io操作,影响整体性能.如果使用默认的drop storage就会立即释放extent,删除的表如果非常大,这对系统有时

怎么在sql中删除基本表?

问题描述 怎么在sql中删除基本表? 怎么在sql中删除基本表?用drop table 表名 cascade时,cascade有语法错,请大神指点啊 解决方案 drop table [cascade] 解决方案二: 将已经存在的表删除: DROP TABLE 表名; 你的语法错误不知道是不是表不存在这些 drop table 表名 cascade,后面这个不应该有cascade 解决方案三: 你第一次的命令是不是想解决约束性问题,你可以参考下面的语法 drop table 表名 cascade

从Mysql中下载大附件时,一直加载,是不是需要设置一下mysql的配置文件

问题描述 从Mysql中下载大附件时,一直加载,是不是需要设置一下mysql的配置文件 文件可以上传成功,速度也还可以,小附件下载时速度还不错,但是大附件(大于10M)下载时一直 显示加载,是不是需要在mysql中设置一下配置文件 解决方案 大于10M的文件你都存数据库中啦?不慢才怪呢,建议楼主以后存储流媒体文件.等一下大的文件,只把文件所在本地的链接存入数据表中就可以了

MySQL中删除重复数据的简单方法_Mysql

MYSQL里有五百万数据,但大多是重复的,真实的就180万,于是想怎样把这些重复的数据搞出来,在网上找了一圈,好多是用NOT IN这样的代码,这样效率很低,自己琢磨组合了一下,找到一个高效的处理方式,用这个方式,五百万数据,十来分钟就全部去除重复了,请各位参考. 第一步:从500万数据表data_content_152里提取出不重复的字段SFZHM对应的ID字段到TMP3表 create table tmp3 as select min(id) as col1 from data_content

新手求解 怎么在mysql中创建多级表结构

问题描述 新手求解 怎么在mysql中创建多级表结构 比如说我要创建一个如下的表结构,该用什么语句,, 类似这种多层结构 解决方案 MySQL创建表结构里面的那个长度对于整型的作用 解决方案二: 多级表结构?使用外键吧! 解决方案三: 数据库里变是没有多级表结构的,你想要实现多级结构,需要通过多表关联.外键关联等操作来实现. 或者在同一个表中,通过字段id和parentId等关系进行区分.

【求助】从大表中删除小表中存在的记录问题

A表:30万,主键ID B表:300万,主键ID 从B表中删除ID=A表ID的记录. DELETE FROM B WHERE EXISTS (SELECT 1 FROM (SELECT ID FROM (SELECT T.ID, ROWNUM RN FROM A) WHERE RN > 0 AND RN <= 50000) AB WHERE A.ID = B.ID); 但执行计划显示COST较大,且瓶颈是B表的全表扫描. 需求是这里有B1 ... B10多个B表(都是300万),串行操作相当于