【MySQL】mysql optimize table

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:
维护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会锁定表。
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
0
31
分享
相关文章
在阿里云的AnalyticDB MySQL版中使用CREATE TABLE语句来创建内表
在阿里云的AnalyticDB MySQL版中使用CREATE TABLE语句来创建内表【1月更文挑战第16天】【1月更文挑战第78篇】
402 3
【MySQL异常】1093 - You can‘t specify target table ‘daily_job‘ for update in FROM clause
【MySQL异常】1093 - You can‘t specify target table ‘daily_job‘ for update in FROM clause
327 0
MySQL技能完整学习列表5、数据库操作——1、创建数据库和表——2、修改表结构(ALTER TABLE)
MySQL技能完整学习列表5、数据库操作——1、创建数据库和表——2、修改表结构(ALTER TABLE)
272 0
MySQL 报错 [ERROR] [FATAL] InnoDB: Table flags are 0 in the data dictionary but the flags in file
MySQL 报错 [ERROR] [FATAL] InnoDB: Table flags are 0 in the data dictionary but the flags in file
1240 0
对于mysql数据库delect from,truncate table,drop table, update操作的时候如何选择
对于mysql数据库delect from,truncate table,drop table, update操作的时候如何选择
383 2
MySQL创建数据表(CREATE TABLE语句)
MySQL创建数据表(CREATE TABLE语句)
1246 0
MySQL 8.0报错--1118-Row size too large. The maximum row size for the used table type, not counting BLOBs,is 8126,
MySQL 8.0报错--1118-Row size too large. The maximum row size for the used table type, not counting BLOBs,is 8126,
MySQL 8.0报错--1118-Row size too large. The maximum row size for the used table type, not counting BLOBs,is 8126,
MySQL异常一之: You can‘t specify target table for update in FROM clause解决办法
这篇文章介绍了如何解决MySQL中“不能在FROM子句中指定更新的目标表”(You can't specify target table for update in FROM clause)的错误,提供了错误描述、需求说明、错误做法和正确的SQL写法。
1562 0
在 MySQL 中使用 Alter Table
【8月更文挑战第11天】
663 0
在 MySQL 中使用 Alter Table
下一篇
oss创建bucket
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等