【MySQL】mysql optimize table

维护mysql 对表空间的回收策略是只拓展,不回收。对表执行delete之后,表空间是不回收的,空闲的空间可以被insert 继续使用,通常执行truncate,重新逻辑导出,再导入或者执行optimize table 三种都可以重新使用未使用的表空间。

本文介绍一下optimize table OPTIMIZE TABLE可以重新利用未使用的空间,并整理数据文件的碎片。

1 演示回收空间

删除之前:

[root@rac1 test]# ll tab.ibd

-rw-rw---- 1 mysql mysql 150994944 10-16 22:15 tab.ibd

对表进行删除操作:

root@rac1 : test 21:12:00> optimize table tab;

Query OK, 0 rows affected (0.01 sec)

Records: 0  Duplicates: 0  Warnings: 0

删除之后:

[root@rac1 test]# ll tab.ibd

-rw-rw---- 1 mysql mysql 98304 10-16 22:15 tab.ibd

显然 ibd文件经过optimize之后 明显的减小了。

2 使用范围

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

对于MyISAM表,OPTIMIZE TABLE按如下方式操作:

1.如果表已经删除或分解了行,则修复表。

2.如果未对索引页进行分类,则进行分类。

3.如果表的统计数据没有更新(并且通过对索引进行分类不能实现修复),则进行更新。

对于BDB表,OPTIMIZE TABLE目前被映射到ANALYZE TABLE上。

对于InnoDB表,OPTIMIZE TABLE被映射到ALTER TABLE上,这会重建表。重建操作能更新索引统计数据并释放成簇索引中的未使用的空间。

3 对于 M-S,M-M 架构的数据库

如果不想把optimize table 写入从数据库,可以执行

OPTIMIZE NO_WRITE_TO_BINLOG TABLE 

这样命令就不会写入binglog 并且不被从库执行。

4 遇到的问题

如果在使用optimize的时候遇到如下错误:

root@rac1 : test 22:10:22> optimize table tab;

+----------+----------+----------+-------------------------------------------------------------------+

| Table    | Op       | Msg_type | Msg_text                                                          |

+----------+----------+----------+-------------------------------------------------------------------+

| test.tab | optimize | note     | Table does not support optimize, doing recreate + analyze instead |

| test.tab | optimize | status   | OK                                                                |

+----------+----------+----------+-------------------------------------------------------------------+

2 rows in set (29.88 sec)

使用--skip-new或--safe-mode选项可以启动mysqld。通过启动mysqld,您可以使OPTIMIZE TABLE对其它表类型起作用。

注意,在OPTIMIZE TABLE运行过程中,MySQL会锁定表。

时间: 2024-10-30 08:35:58

【MySQL】mysql optimize table的相关文章

【锁】MySQL间隙锁

[锁]MySQL间隙锁 前段时间系统老是出现insert死锁,很是纠结.经过排查发现是间隙锁!间隙锁是innodb中行锁的一种, 但是这种锁锁住的却不止一行数据,他锁住的是多行,是一个数据范围.间隙锁的主要作用是为了防止出现幻读,但是它会把锁定范围扩大,有时候也会给我们带来麻烦,我们就遇到了. 在数据库参数中, 控制间隙锁的参数是:innodb_locks_unsafe_for_binlog, 这个参数默认值是OFF, 也就是启用间隙锁, 他是一个bool值, 当值为true时表示disable

【MySQL】MySQL的四种事务隔离级别

[MySQL]MySQL的四种事务隔离级别 本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一.事务的基本要素(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节.事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样.也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位.  2.一致性(Consistency):事务开始前和结束后,数据库的完整性约束

【转】利用optimize、存储过程和系统表对mysql数据库表进行批量碎片清理释放表空间

本文收集于本人的笔记本,由于找不到原文出处.在此省略,如哪位知道可以联系我加上. 核心是利用mysql系统表和"optimize table 表名"命令,对mysql数据表进行空间的释放.由于delete和drop table都不会释放表空间(truncate 命令会释放表空间[将所有的数据都删除]),所以需要利用optimize 命令进行释放. 这个存储过程目的是给一个库的所有表来整理碎片的.一个表随着插入很频繁,或者一直更新不停的,就会积累好多碎片.如果及时整理一下,查询效率会高出

【转载】MySQL Temporary Table 相关问题的探究

[问题的引入]       让我们先来观察几条非常简单的 MySQL 语句: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 mysql> create temporary table tmp(id int, data char(20)); Query OK, 0 rows affected (0.01 sec)   mysql> create table tmp(id int, data char(20)); Query OK, 0 rows affected (

【转载】MySQL慢查询日志总结

MySQL慢查询日志总结 2016-06-17 10:32 by 潇湘隐者, 1166 阅读, 1 评论, 收藏, 编辑 慢查询日志概念      MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中.long_query_time的默认值为10,意思是运行10S以上的语句.默认情况下,Mysql数据库并不启动慢查询日志,需要我们手动来设置这个参数,当然,如果不是

【整理】MySQL 之 日志

MySQL 中的各种日志文件  1. 错误日志 --log-error[=file_name]       错误日志记录了 mysql server 运行过程中所有较为严重的警告和错误信息,以及 mysql 每次启动和关闭的详细信息.       错误日志默认放在数据目录下,以 hostname.err 命名.但是可以使用命令 --log-error[=file_name] 修改其存放目录和文件名.       有时候,希望将错误日志做备份并重新开始记录,使用 flush logs 命令备份文件

【原创】MySQL 之 slow log

慢查询有什么用?         它能记录下所有执行超过long_query_time时间的SQL语句,帮你找到执行慢的SQL,方便我们对这些SQL进行优化.    测试用 MySQL 版本.   Server version: 5.6.10-log Source distribution    未做任何慢日志设置时.    ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 mysql> show variables like "

【原创】MySQL Proxy - 核心篇

核心层篇(Core)          Network Core 构建于 socket 处理实现的基础之上,将 client connection 和 server connection 关联到一起.     [Connection Life Cycle]    connection 可处于下面 4 种协议基本 phase 之一:    connect authentification query disconnect        通过对 plugin 功能的定制实现,可以改变 network

【MySql】mysql 慢日志查询工具之mysqldumpslow

    当使用--log-slow-queries[=file_name]选项启动时,mysqld写一个包含所有执行时间超过long_query_time秒的SQL语句的日志文件.获得初使表锁定的时间不算作执行时间. 如果没有给出file_name值, 默认未主机名,后缀为-slow.log.如果给出了文件名,但不是绝对路径名,文件则写入数据目录. 语句执行完并且所有锁释放后记入慢查询日志.记录顺序可以与执行顺序不相同. 慢查询日志可以用来找到执行时间长的查询,可以用于优化.但是,检查又长又慢的