首先看一下语法: 
OPTIMIZE [NO_WRITE_TO_BINLOG | LOCAL] TABLE tbl_name [, tbl_name] ...
我们知道mysql存储引擎里面的数据和索引数据都是物理存储的,所以说为了减少空间使用和访问表的时候能有更好的IO表现,所以说当表执行OPTIMIZE TABLE的时候,是会发生切实的变化的.
一般以下集中情况下,我们会使用OPTIMIZE TABLE来进行优化:
1:在大量的插入,更新,或者删除INNODB表以后,我们再执行是很有必要的.此时如果执行OPTIMIZE TABLE的话,整表和表上所有的索引都会重组,而且不使用的表空间会被回收给操作系统.
2:在大量的插入,更新,或者删除有全文索引的INNODB表的字段以后,不过要首先设置innodb_optimize_fulltext_only=1,也可以通过指定innodb_ft_num_word_optimize 的值来指定能在索引里面更新多少记录.记录数满的时候就要通过OPTIMIZE TABLE来优化表.
3:在 MyISAM和 ARCHIVE 表做大量的删除的时候就需要执行OPTIMIZE TABLE,或者是 MyISAM和 ARCHIVE 表做了字段长度的更改,如果此时表中有大字段的话,就更需要执行OPTIMIZE TABLE 来优化表了.因为被删除的记录的位置还是会保存,并不会进行回收,等待新纪录插入,或者OPTIMIZE TABLE 进行重组才回回收.而且最重要的一点是OPTIMIZE TABLE以后性能会得到很大的提升,特别是表做过较大的变更以后在执行,性能提升会非常的明显.
OPTIMEZE TABLE 需要的权限:
对表insert 和 select权限.
而且OPTIMIZE TABLE 对分区表也是支持的,具体的语法是
ALTER TABLE t1 OPTIMIZE PARTITION p0, p1;
从上面就可以看出来OPTIMEZE TABLE对于INNODB,MyISAM和 ARCHIVE 的表都是适用的,对于其他引擎的数据表都是不适用的,如果想要使用OPTIMIZE TABLE 优化表,就要在启动mysqld的时候使用--skip-new参数启动.
OPTIMIZE TABLE 可以在线DDL,通过指定(ALGORITHM=INPLACE) ,不过这个只支持INNODB表,普通表和分区表都是支持的.表重建的方式有两种,OPTIMIZE TABLE 和 ALTER TABLE ... FORCE两种方式都可以触发表重建.
OPTIMIZE TABLE 也有适用于 ALGORITHM=COPY的一些条件:
1:当old_alter_table参数设置为ON的时候,OPTIMIZE并不会重建,而是使用一个临时表先把记录插进去来做处理.这个时候就要使用ALGORITHM=COPY来处理了.
2:当mysqld以--skip-new 为方式启动的时候
3:当INNODB表含有全文索引的时候 ,就只能够使用ALGORITHM=COPY来进行优化了
INNODB的数据存储是按照page-allocation的方式存储的,这和MYASIM引擎是不相同的,所以当我们考虑要OPTIMEZE一张表的时候,一定要先考虑以下的几个问题:
1:INNODB表的索引碎片是有所保留的,一般情况下是最多只能够占用93%的,剩余的一些是要保留起来用于update更新时候的页分裂来分配空间
2:删除操作会留下一部分的空间,只有当OPTIMIZE TABLE的时候才会重新的回收.
3:update的记录等于是对原有的数据页进行重新的写入,这和数据类型和行格式是有很大关系的.这个是有前提条件的,就是原有的页有足够的空间能够书写新数据.
4:高并发的情况下,会造成索引的间隙,这个产生的主要原因就是因为MySQL的事物是基于MVCC来实现的.
 
OPTIMIZE TABLE 对于MYASIM表的支持:
1:如果表有删除或者行拆分的话,就要repair table
2:如果索引页没有划分,就会重新划分索引页
3:统计信息如果不准确的话,就会重新更新统计信息
 
OPTIMIZE TABLE 返回信息尅看一下:
Column Value
Table The table name
Op Always optimize
Msg_type status, error, info, note, or warning
Msg_text An informational message
但是还要记住一点就是5.7.4以前的版本OPTIMIZE TABLE的时候会锁定全表,之后版本的INNODB表就就可以在线OPTIMIZE 了.而且更重要的是OPTIMIZE TABLE 会记录二进制日志,所以说对于复制的机器是会传送到slave上的.而且他对R-TREE结构的索引是不起作用的.
 
快速分析mysql的表信息,MYASIM引擎:
myisamchk --quick --check-only-changed --sort-index --analyze
重新组织表:
ALTER TABLE [tbl_name] TYPE=innodb
修改表行格式:
alter table your_table row_format=compressed
 

OPTIMIZE TABLE 小解的更多相关文章

  1. 使用 SQL 命令 OPTIMIZE TABLE 释放表空间

    前提: 1.删除了表的一大部分: 2.已经对含有可变长度行的表(含有VARCHAR, BLOB或TEXT列的表)进行了很多更改. ----------------------------------- ...

  2. mysql下优化表和修复表命令使用说明(REPAIR TABLE和OPTIMIZE TABLE)

    随着mysql的长期使用,可以修复表来优化,优化时减少磁盘占用空间.方便备份. REPAIR TABLE `table_name` 修复表 OPTIMIZE TABLE `table_name` 优化 ...

  3. mysql中OPTIMIZE TABLE的作用

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

  4. OPTIMIZE TABLE的作用--转载

    当您的库中删除了大量的数据后,您可能会发现数据文件尺寸并没有减小.这是因为删 除操作后在数据文件中留下碎片所致.Discuz! 在系统数设置界面提供了数据表优化的功能,可以去除删除操作后留下的数据文件 ...

  5. optimize table table_name myisam mysql自动清除删除过留下的空记录

    optimize table table_name 这个可以清除你表里面的空记录,每次清除的时候记得锁表 lock tables table_name  write|read; unlock tabl ...

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

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

  7. OPTIMIZE TABLE

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

  8. optimize table 表优化问题

    语法: optimize table '表名' 一,原始数据 1,数据量 2,存放在硬盘中的表文件大小 3,查看一下索引信息 索引信息中的列的信息说明. Table :表的名称.Non_unique: ...

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

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

随机推荐

  1. nodejs单元测试

    前言: 之前一直听说过单元测试,但是具体怎么做,也没有深入研究,感觉测试是一件很麻烦的事,花费时间.可能是自己太懒了,一看到测试那么多陌生的东西就不想弄了. 然后一拖再拖,直到最近,换了一家公司,然后 ...

  2. Keep-Alive 总结

    一.简介 Keep-Alive是http请求头信息中的一个配置参数,开启之后俗称保持HTTP长连接,HTTP 1.0和HTTP 1.1都支持,HTTP1.0中该属性默认是关闭的,可在头信息中配置开启( ...

  3. Dual Number

    http://ncatlab.org/nlab/show/dual+number http://mathworld.wolfram.com/DualNumber.html https://en.wik ...

  4. vue.js 2.0开发(3)

    组件化 Vue.component('todo-items',{ }); 定义组件,首先是标签的名字todo-items,然后里面还要配置一些选项,首先是我们的模板template,里面需要填入的内容 ...

  5. vbox丢失*MultiArch_amd64.msi或者*MultiArch_x86.msi重新制作

    1.去官网下载你缺少这个文件的那个版本的exe文件. 2.下载7-zip软件(就在百度下载,比较小). 3.用7-zip解压这个exe.会出现一个文件夹,大概名字为VirtualBox-4.3.12- ...

  6. (.text+0x12): undefined reference to `rpl_fprintf'

    问题1:(.text+0x12): undefined reference to `rpl_fprintf'解决办法:在yacc前面添加%{#undef yyerrorvoid yyerror (ch ...

  7. linux下搭建sock5代理

    VPN大家耳熟能详,但是socks用到的人比较少,那什么是socks呢?请看第二段或者百度百科,socks分别有4和5两个版本,现在5为主流.工作中经常用VPN访问国外,但是同时国内的速度又慢了,让人 ...

  8. 炉石ZZ操作 [20161224]

    昨天吃完晚饭,开了一盘炉石.选的龙牧,遇到对面马克扎尔战士. 中途,我场上3个较大随从,他突然先拍下一个铜须,菊花一紧,然后果然拍下了大工匠(之前用龙人侦察者看到他牌库有这张牌),逗比的一幕开始了,首 ...

  9. 基于Grunt&Mocha 搭建Nodejs自动化单元测试框架(含代码覆盖率统计)

    Introduction Grunt 是一个基于任务的JavaScript 世界的构建工具 Mocha 是具有丰富特性的 JavaScript 测试框架,可以运行在 Node.js 和浏览器中,使得异 ...

  10. gradle修改AndroidManifest.xml中的版本号

    def VersionCode = "19" ant.replaceregexp(file:"../Assets/Plugins/Android/AndroidManif ...