optimize 优化表
OPTIMIZE 命令支持的引擎MyIsam, InnoDB, ARCHVE当对表有大量的增删改操作时,需要用optimize对表进行优化,可以减少空间与提高I/O性能,命令optimize table tablename;1.假如有session表且存储引擎为MyISAM
mysql> OPTIMIZE TABLE session;+--------------+----------+----------+----------+| Table | Op | Msg_type | Msg_text |+--------------+----------+----------+----------+| test.session | optimize | status | OK |+--------------+----------+----------+----------+1 row in set2.如果是InnoDB引擎首先查看innodb_file_per_table(是否独享表空间)。mysql> show variables like 'innodb_file_per_table';+-----------------------+-------+| Variable_name | Value |+-----------------------+-------+| innodb_file_per_table | ON |+-----------------------+-------+1 row in seton表示打开了OFF代表开启共享表空间没有打开即采用的是默认的共享表空间这个时候可以在mysql的datadir路径下看到一个非常大的文件ibdata1,这个文件存储了所有InnoDB表的数据与索引如果开启了独享表空间,即每张表都有ibdfile,这个时候如果删除了大量的行,索引会重组并且会释放相应的空间因此不必优化由于共享表空间所有表的数据与索引都存放于ibddata1文件中随着数据量的增长会导致该文件越来越大,超过10G的时候查询速度就非常慢,因此在编译的时候最好开启独享表空间,因为mysql默认是关闭了独享表空间下面有两个解决方案方案一:先逻辑备份所有的数据库,将配置文件中innodb_file_per_table参数=1,再将备份导入方案二:只要修改innodb_file_per_table参数,然后将需要修改的所有innodb的表都运行一遍 alter table table_name engine=innodb;即可使用第二种方式修改后,原来库中的表中的数据会继续存放于ibdata1中,新建的表才会使用独立表空间stu是innodb
mysql> OPTIMIZE TABLE stu;+----------+----------+----------+-------------------------------------------------------------------+| Table | Op | Msg_type | Msg_text |+----------+----------+----------+-------------------------------------------------------------------+| test.stu | optimize | note | Table does not support optimize, doing recreate + analyze instead || test.stu | optimize | status | OK |+----------+----------+----------+-------------------------------------------------------------------+2 rows in set这时需要mysql> alter table stu engine='innodb';Query OK, 0 rows affectedRecords: 0 Duplicates: 0 Warnings: 0mysql> analyze table stu;
+----------+---------+----------+----------+| Table | Op | Msg_type | Msg_text |+----------+---------+----------+----------+| test.stu | analyze | status | OK |+----------+---------+----------+----------+1 row in set来优化表