mysql 数据文件的使用是只扩展,不回收。对表执行delete之后,磁盘上数据文件是不会缩小的。
通常的做法,是先逻辑导出,然后truncate 原表(或者删除重建),再导入。
另外还有一种方法是optimize table ,但是有一定的限制。
 
同事问我在innodb 上一张200G+ 的表,使用了optimize table 整理碎片,回收空间时,执行了快3个小时,空间不仅没有减少,还增加了200多个G,磁盘空间都用光了。问我怎么处理。
这个问题之前也没有遇到过。所以今天学习并整理了下。
 关于optimize table 回收空间的效果这里不做演示,网上一大把。
 
1. 适用范围
 
OPTIMIZE TABLE只对MyISAM, BDB和InnoDB表起作用。
 三种不同的存储引擎,optimize table 的处理逻辑是不一样的。最关键的就是这个处理逻辑:
 
MyISAM:
1.如果表已经删除或分解了行,则修复表。
2.如果未对索引页进行分类,则进行分类。
3.如果表的统计数据没有更新(并且通过对索引进行分类不能实现修复),则进行更新。
 
BDB
OPTIMIZE TABLE目前被映射到ANALYZE TABLE上。
 
INNODB:
OPTIMIZE TABLE被映射到ALTER TABLE ... FORCE ,这会重建表。重建操作能更新索引统计数据并释放成簇索引中的未使用的空间。
在5.6.17之前,optimize table 会锁表,从5.6.17开始,optimize table 变成在线操作,表锁只会发生在解析和提交两个阶段, 这两个过程是极短的,可以忽略。
也就是说,对DML操作基本不会引起堵塞。
 
当满足以下两个条件时,mysql 会使用copy 方法复制数据(copy的速度比insert要快):
  • 开启mysqld --skip-new 选项
  • old_alter_table 系统变量设置为enable状态

需要注意的是,如果表上包含fulltext索引,optimize table 操作使用的是copy method ,而不会选择online在线的方式

 
 
2. 不在binlog中记录optimize table 操作
 
OPTIMIZE NO_WRITE_TO_BINLOG TABLE 
 
3. 遇到的问题
如果在使用optimize的时候遇到如下错误:
root@rac1 : test 22:10:22> optimize table tab;
+----------+----------+----------+-------------------------------------------------------------------+
| Table    | Op       | Msg_type | Msg_text                                                          |
+----------+----------+----------+-------------------------------------------------------------------+
| test.tab | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
| test.tab | optimize | status   | OK                                                                |
+----------+----------+----------+-------------------------------------------------------------------+
2 rows in set (29.88 sec)
使用--skip-new或--safe-mode选项可以启动mysqld。通过启动mysqld,您可以使OPTIMIZE TABLE对其它表类型起作用。
 

mysql optimize table的更多相关文章

  1. MySQL: OPTIMIZE TABLE: Table does not support optimize, doing recreate + analyze instead

    show create table history;-------------------------- CREATE TABLE `foo` (  `itemid` bigint(20) unsig ...

  2. mysql中OPTIMIZE TABLE的作用

    在使用mysql的时候有时候,可能会发现尽管一张表删除了许多数据,但是这张表表的数据文件和索引文件却奇怪的没有变小.这是因为mysql在删除数据(特别是有Text和BLOB)的时候,会留下许多的数据空 ...

  3. 实例说明optimize table在优化MySQL时很重要

    今天在看CU的时候,发现有人问有关optimize来表优化的问题,当年因为这个问题,困扰我很长一段时间,今天有空我把这个问题,用实际数据来展示出来,让大家可以亲眼来看看,optimize table的 ...

  4. mysql中OPTIMIZE TABLE的作用

    转载▼ 1.先来看看多次删除插入操作后的表索引情况 mysql> SHOW INDEX FROM `tbl_name`; +----------+------------+----------- ...

  5. mysql之 OPTIMIZE TABLE整理碎片

    来看看手册中关于 OPTIMIZE 的描述: OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ... 如果您已经删除 ...

  6. optimize table 删除空洞--MYSQL

    来看看手册中关于 OPTIMIZE 的描述: OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ... 如果您已经删除 ...

  7. mysql中OPTIMIZE TABLE的作用及使用

    来看看手册中关于 OPTIMIZE 的描述: OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ... 如果您已经删除 ...

  8. 使用OPTIMIZE TABLE命令来整理表碎片实践

    操作环境:ubuntu 14.10   mysql 5.6.25 对含有BLOB或TEXT字段的表,若经常做修改或删除类的操作,需要定期执行OPTIMIZE TABLE命令来整理碎片. 1.creat ...

  9. OPTIMIZE TABLE

    INNODB 不支持 mysql> OPTIMIZE TABLE t; +--------+----------+----------+----------------------------- ...

随机推荐

  1. 【转】Python 面向对象(初级篇)

    [转]Python 面向对象(初级篇) 51CTO同步发布地址:http://3060674.blog.51cto.com/3050674/1689163 概述 面向过程:根据业务逻辑从上到下写垒代码 ...

  2. 一道并查集的(坑)题:关闭农场closing the farm

    题目描述 in English: Farmer John and his cows are planning to leave town for a long vacation, and so FJ ...

  3. IOS应用内嵌cocos2dx游戏项目

    1.创建Cocos2d-x项目 相比于Android来说cocos2dx的iPhone环境基本不用配置,直接创建用xcode打开就可以运行. 到Cocos2d-x官方网站下载最新版本引擎. 将刚才下载 ...

  4. 数据库join union 区别

    join 是两张表做交连后里面条件相同的部分记录产生一个记录集,union是产生的两个记录集(字段要一样的)并在一起,成为一个新的记录集. 1.JOIN和UNION区别  join 是两张表做交连后里 ...

  5. web@css普通布局 , 高级布局 , 布局坑

    1.高级布局<文档流概念>:页面从上至下,块式标签一行一行排列,内联式一行中从左至右排列<BFC规则>:左右位置(左右margin)垂直位置(上下margin)容器内外(互不影 ...

  6. Android apk互调

    1.启动另外一个应用程序的主Activity. //这些代码是启动另外的一个应用程序的主Activity,当然也可以启动任意一个Activity ComponentName componetName ...

  7. 性能工具之JMeter+InfluxDB+Grafana打造压测可视化实时监控【转】

    概述 本文我们将介绍如何使用JMeter+InfluxDB+Grafana打造压测可视化实时监控. 引言 我们很多时候在使用JMeter做性能测试,我们很难及时察看压测过程中应用的性能状况,总是需要等 ...

  8. Django 自定义模型管理器类2个应用场景

    class BookManager(models.Manager): # 改变查询集的结果集 def all(self): books = super().all() # QuerySet books ...

  9. 使用SimHash进行海量文本去重[转]

    阅读目录 1. SimHash与传统hash函数的区别 2. SimHash算法思想 3. SimHash流程实现 4. SimHash签名距离计算 5. SimHash存储和索引 6. SimHas ...

  10. linux显示完整目录

    vim ~/.bashrc ##添加以下信息 export PS1='[\u@\h `pwd`]$ ' 然后保存退出 source  ~/.bashrc 或者关机重新启动即可