• mysql中OPTIMIZE TABLE的作用


    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会锁定表。


    当 您的库中删除了大量的数据后,您可能会发现数据文件尺寸并没有减小。这是因为删 除操作后在数据文件中留下碎片所致。Discuz! 在系统数设置界面提供了数据表优化的功能,可以去除删除操作后留下的数据文件碎片,减小文件尺寸,加快未来的读写操作。您只要在做完批量删除,或定期(如 每一两个月)进行一次数据表优化操作即可。

    OPTIMIZE TABLE通过制作原来的表的一个临时副本来

    OPTIMIZE TABLE语法

    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表起作用。

    对于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运行过程中,会锁定表。

    OPTIMIZE TABLE语句被写入到二进制中,除非使用了自选的NO_WRITE_TO_BINLOG关键词(或其别名LOCAL)。已经这么做了,因此,用于 MySQL服务器的OPTIMIZE TABLE命令的作用相当于一个复制主服务器,在默认情况下,这些命令将被复制到复制从属服务器中。

  • 相关阅读:
    不要跟亲戚谈生意
    docker学习连接
    docker之docker-compose——容器管理
    docker之镜像管理——仓库使用
    docker之入门——安装及基本命令
    orcle数据库新建用户
    hibernate select 查询方式总结
    Hibernate 主配置文件详解
    ActionContext和ServletActionContext小结(struts2)
    理解Java常量池
  • 原文地址:https://www.cnblogs.com/Alight/p/3585646.html
Copyright © 2020-2023  润新知