找出有碎片的所有的表
SELECT TABLE_NAME,DATA_FREE FROM information_schema.TABLES WHERE Data_free > 0 \G 
然后优化
OPTIMIZE TABASE T;   一次一个?请问可以批量的进行优化吗?

解决方案 »

  1.   

    OPTIMIZE TABLE t1,t2,t3,t4....tn;
      

  2.   

    SELECT TABLE_NAME,DATA_FREE FROM information_schema.TABLES WHERE Data_free > 0
    结果COPY下来,在编辑软件中处理一下,形成
    OPTIMIZE TABLE tbl_name [, tbl_name] ...
      

  3.   

    那就打开游标循环取值,生成OPTIMIZE TABLE tbl_name [, tbl_name] ...字符串,再动态执行
    MYSQL5.1.10以上支持
      

  4.   

    在多数的设置中,您根本不需要运行OPTIMIZE TABLE。即使您对可变长度的行进行了大量的更新,您也不需要经常运行,每周一次或每月一次即可,只对特定的表运行。OPTIMIZE TABLE只对MyISAM, BDB和InnoDB表起作用。对于MyISAM表,OPTIMIZE TABLE按如下方式操作:1.    如果表已经删除或分解了行,则修复表。2.    如果未对索引页进行分类,则进行分类。3.       如果表的统计数据没有更新(并且通过对索引进行分类不能实现修复),则进行更新。对于BDB表,OPTIMIZE TABLE目前被映射到ANALYZE TABLE上。对于InnoDB表,OPTIMIZE TABLE被映射到ALTER TABLE上,这会重建表。重建操作能更新索引统计数据并释放成簇索引中的未使用的空间。请参见13.5.2.1节,“ANALYZE TABLE语法”。使用—skip-new或—safe-mode选项可以启动mysqld。通过启动mysqld,您可以使OPTIMIZE TABLE对其它表类型起作用。注意,在OPTIMIZE TABLE运行过程中,MySQL会锁定表。