mysql中OPTIMIZE TABLE的作用

在使用mysql的时候有时候,可能会发现尽管一张表删除了许多数据,但是这张表表的数据文件和索引文件却奇怪的没有变小。这是因为mysql在删除数据(特别是有Text和BLOB)的时候,会留下许多的数据空洞,这些空洞会占据原来数据的空间,所以文件的大小没有改变。这些空洞在以后插入数据的时候可能会被再度利用起来,当然也有可能一直存在。这种空洞不仅额外增加了存储代价,同时也因为数据碎片化降低了表的扫描效率。

1、先来看看多次删除插入操作后的表索引情况

mysql> SHOW INDEX FROM `tbl_name`;+----------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |+----------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+| tbl_name | 0 | PRIMARY | 1 | StepID | A | 1 | NULL | NULL | | BTREE | || tbl_name | 1 | FlowID | 1 | FlowID | A | 1 | NULL | NULL | | BTREE | || tbl_name | 1 | WagerCount | 1 | WagerCount | A | 1 | NULL | NULL | | BTREE | || tbl_name | 1 | WagerID_3 | 1 | WagerID | A | 1 | NULL | NULL | | BTREE | || tbl_name | 1 | WagerID_3 | 2 | StepType | A | 1 | NULL | NULL | | BTREE | || tbl_name | 1 | WagerID_3 | 3 | ParamResult | A | 1 | 255 | NULL | | BTREE | || tbl_name | 1 | StepType_2 | 1 | StepType | A | 1 | NULL | NULL | | BTREE | || tbl_name | 1 | StepType_2 | 2 | ParamResult | A | 1 | 255 | NULL | | BTREE | || tbl_name | 1 | WagerID_2 | 1 | WagerID | A | 1 | NULL | NULL | | BTREE | || tbl_name | 1 | WagerID_2 | 2 | StepType | A | 1 | NULL | NULL | | BTREE | || tbl_name | 1 | WagerID_2 | 3 | ParamResult | A | 1 | 255 | NULL | | BTREE | |+----------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+11 rows in set (0.01 sec)

2、优化表

mysql> optimize table tbl_name;+---------------+----------+----------+----------+| Table | Op | Msg_type | Msg_text |+---------------+----------+----------+----------+| test.tbl_name | optimize | status | OK |+---------------+----------+----------+----------+1 row in set (40.60 sec)

3、再来看看优化后的效果

mysql> SHOW INDEX FROM `tbl_name`;+----------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |+----------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+| tbl_name | 0 | PRIMARY | 1 | StepID | A | 172462 | NULL | NULL | | BTREE | || tbl_name | 1 | FlowID | 1 | FlowID | A | 86231 | NULL | NULL | | BTREE | || tbl_name | 1 | WagerCount | 1 | WagerCount | A | 4311 | NULL | NULL | | BTREE | || tbl_name | 1 | WagerID_3 | 1 | WagerID | A | 86231 | NULL | NULL | | BTREE | || tbl_name | 1 | WagerID_3 | 2 | StepType | A | 172462 | NULL | NULL | | BTREE | || tbl_name | 1 | WagerID_3 | 3 | ParamResult | A | 172462 | 255 | NULL | | BTREE | || tbl_name | 1 | StepType_2 | 1 | StepType | A | 9 | NULL | NULL | | BTREE | || tbl_name | 1 | StepType_2 | 2 | ParamResult | A | 86231 | 255 | NULL | | BTREE | || tbl_name | 1 | WagerID_2 | 1 | WagerID | A | 86231 | NULL | NULL | | BTREE | || tbl_name | 1 | WagerID_2 | 2 | StepType | A | 172462 | NULL | NULL | | BTREE | || tbl_name | 1 | WagerID_2 | 3 | ParamResult | A | 172462 | 255 | NULL | | BTREE | |+----------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+

最后,来看看手册中关于 OPTIMIZE 的描述:

OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...

如果您已经删除了表的一大部分,或者如果您已经对含有可变长度行的表(含有VARCHAR, BLOB或TEXT列的表)进行了很多更改,则应使用OPTIMIZE TABLE。被删除的记录被保持在链接清单中,后续的INSERT操作会重新使用旧的记录位置。您可以使用OPTIMIZE TABLE来重新利用未使用的空间,并整理数据文件的碎片。

在多数的设置中,您根本不需要运行OPTIMIZE TABLE。即使您对可变长度的行进行了大量的更新,您也不需要经常运行,每周一次或每月一次即可,只对特定的表运行。

OPTIMIZE TABLE只对MyISAM, BDB和InnoDB表起作用。

注意,在OPTIMIZE TABLE运行过程中,MySQL会锁定表。
时间: 2024-07-29 07:14:31

mysql中OPTIMIZE TABLE的作用的相关文章

mysql中OPTIMIZE TABLE的作用及使用

来看看手册中关于 OPTIMIZE 的描述: OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ... 如果您已经删除了表的一大部分,或者如果您已经对含有可变长度行的表(含有VARCHAR, BLOB或TEXT列的表)进行了很多更改,则应使用OPTIMIZE TABLE.被删除的记录被保持在链接清单中,后续的INSERT操作会重新使用旧的记录位置.您可以使用OPTIMIZE TABLE来重新利用未使用的空间,并整理

mysql的optimize table命令

在使用mysql的时候有时候,可能会发现尽管一张表删除了许多数据,但是这表表的数据文件和索引文件却奇怪的没有变小.这是因为mysql在删除数据(特别是有Text和BLOB)的时候,会留下许多的数据空洞,这些空洞会占据原来数据的空间,所以文件的大小没有改变.这些空洞在以后插入数据的时候可能会被再度利用起来,当然也有可能一直存在.这种空洞不仅额外增加了存储代价,同时也因为数据碎片化降低了表的扫描效率. mysql提供了解决这一个问题的方法:optimize table table_name 命令.该

MySQL中create table as 与like的区别分析

这篇文章主要介绍了MySQL中create table as 与like的区别,结合实例分析了二者在使用中的具体区别与主要用途,需要的朋友可以参考下,具体如下: 对于mysql的复制相同表结构方法,有create table as 和create table like 两种,区别是什么呢? 代码如下: create table t2 as select * from t1 where 1=2; as创建出来的t2表(新表)缺少t1表(源表)的索引信息,只有表结构相同,没有索引. 代码如下: cr

MySQL中optimize优化表

前言 当对MySQL进行大量的增删改操作的时候,很容易产生一些碎片,这些碎片占据着空间,所以可能会出现删除很多数据后,数据文件大小变化不大的现象.当然新插入的数据仍然会利用这些碎片.但过多的碎片,对数据的插入操作是有一定影响的,此时,我们可以通过optimize来对表的优化. 为了更加直观的看到数据碎片,Mysql可以使用如下命令查看 show table status [like table_name] 如下图 data_free选项代表数据碎片. 针对MySQL的不同数据库存储引擎,在opt

Mysql中对table的操作问题

今天利用一个mysql问题来对前期学习Mysql操作的一个小小的检验!!现在总结一下Mysql中对表格的建立.插入特定的数据.以及查询满足某一段条件的数据等等进行操作. 首先需要建立如下三个表(table): 客户表   customer: cno            客户号 cname      客户名称 商品表   goods: gno          商品号 gname      商品名称 订单表     orders: data         日期(8位整数表示,如20160823

mysql中 show table status 获取表信息

用法 mysql>show table status; mysql>show table status like 'esf_seller_history'\G; mysql>show table status like 'esf_%'\G; 例子: mysql>show table status like 'esf_seller_history'\G; 1.Name 表名称 2.Engine: 表的存储引擎 3.Version: 版本号 4.Row_format 行格式. 对于My

mysql中floor函数的作用是什么?

需求描述: 最近写mysql程序的时候,使用了floor函数,在此记录下该函数的作用 操作过程: 1.使用floor函数的测试 mysql> select floor(1.23),floor(-1.23); +-------------+--------------+ | floor(1.23) | floor(-1.23) | +-------------+--------------+ | 1 | -2 | +-------------+--------------+ 1 row in se

MySQL中serial关键字的作用

SERIAL是BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE的一个别名. 在整数列定义中,SERIAL DEFAULT VALUE是NOT NULL AUTO_INCREMENT UNIQUE的一个别名. 注:上面NOT NULL是不可为空,AUTO_INCREMENT是递增,指定起始值为1用AUTO_INCREMENT=1语句,不指定默认也为1.UNIQE是不可重复的意思,取值不能与已经存在的数据重复.

mySql中alter table的使用

1.修改表名:alter table 原表名 rename to 新表名; 2.新增列:alter table 表名 add column 列名 varchar(20) ; 3.删除列:alter table 表名 drop column 列名; 4.修改列名: alter table 表名 change 原列名 新列名 varchar(20) ; 5.修改列属性:alter table 表名 modify 列名 varchar(20) ;