MySQL表碎片整理

  • 1. 计算碎片大小
  • 2. 整理碎片
    • 2.1 使用`alter table table_name engine = innodb`命令进行整理。
    • 2.2 使用pt-online-schema-change工具也能进行在线整理表结构,收集碎片等操作。
    • 2.3 使用optimize table命令,整理碎片。
  • 3. 整理表碎片shell脚本
  • 计算碎片大小

  • 整理碎片

  • 整理表碎片shell脚本

1. 计算碎片大小

要整理碎片,首先要了解碎片的计算方法。

可以通过show table [from|in db_name] status like '%table_name%'命令查看:

mysql> show table from employees status like 't1'\G
*************************** 1. row ***************************Name: t1Engine: InnoDBVersion: 10Row_format: DynamicRows: 1176484Avg_row_length: 86Data_length: 101842944
Max_data_length: 0Index_length: 0Data_free: 39845888Auto_increment: NULLCreate_time: 2018-08-28 13:40:19Update_time: 2018-08-28 13:50:43Check_time: NULLCollation: utf8mb4_general_ciChecksum: NULLCreate_options: Comment:
1 row in set (0.00 sec)

碎片大小 = 数据总大小 - 实际表空间文件大小

  • 数据总大小 = Data_length + Index_length = 101842944

  • 实际表空间文件大小 = rows * Avg_row_length = 1176484 * 86 = 101177624

  • 碎片大小 = (101842944 - 101177624) / 1024 /1024 = 0.63MB

通过information_schema.tablesDATA_FREE列查看表有没有碎片:

SELECT t.TABLE_SCHEMA,t.TABLE_NAME,t.TABLE_ROWS,t.DATA_LENGTH,t.INDEX_LENGTH,concat(round(t.DATA_FREE / 1024 / 1024, 2), 'M') AS datafree
FROM information_schema.tables t
WHERE t.TABLE_SCHEMA = 'employees'+--------------+--------------+------------+-------------+--------------+----------+
| TABLE_SCHEMA | TABLE_NAME   | TABLE_ROWS | DATA_LENGTH | INDEX_LENGTH | datafree |
+--------------+--------------+------------+-------------+--------------+----------+
| employees    | departments  |          9 |       16384 |        16384 | 0.00M    |
| employees    | dept_emp     |     331143 |    12075008 |     11567104 | 0.00M    |
| employees    | dept_manager |         24 |       16384 |        32768 | 0.00M    |
| employees    | employees    |     299335 |    15220736 |            0 | 0.00M    |
| employees    | salaries     |    2838426 |   100270080 |     36241408 | 5.00M    |
| employees    | t1           |    1191784 |    48824320 |     17317888 | 5.00M    |
| employees    | titles       |     442902 |    20512768 |     11059200 | 0.00M    |
| employees    | ttt          |          2 |       16384 |            0 | 0.00M    |
+--------------+--------------+------------+-------------+--------------+----------+
8 rows in set (0.00 sec)

2. 整理碎片

2.1 使用alter table table_name engine = innodb命令进行整理。

 root@localhost [employees] 14:27:01> alter table t1   engine=innodb;Query OK, 0 rows affected (5.69 sec)Records: 0  Duplicates: 0  Warnings: 0root@localhost [employees] 14:27:15> show table status like 't1'\G*************************** 1. row ***************************Name: t1Engine: InnoDBVersion: 10Row_format: DynamicRows: 1191062Avg_row_length: 48Data_length: 57229312
Max_data_length: 0Index_length: 0Data_free: 2097152Auto_increment: NULLCreate_time: 2018-08-28 14:27:15Update_time: NULLCheck_time: NULLCollation: utf8mb4_general_ciChecksum: NULLCreate_options: Comment: 1 row in set (0.00 sec)

2.2 使用pt-online-schema-change工具也能进行在线整理表结构,收集碎片等操作。

 [root@mysqldb1 14:29:29 /root]# pt-online-schema-change --alter="ENGINE=innodb" D=employees,t=t1 --executeCannot chunk the original table `employees`.`t1`: There is no good index and the table is oversized. at /opt/percona-toolkit-3.0.11/bin/pt-online-schema-change line 5852.需要表上有主键或唯一索引才能执行[root@mysqldb1 14:31:16 /root]
# pt-online-schema-change --alter='engine=innodb' D=employees,t=salaries --execute
No slaves found.  See --recursion-method if host mysqldb1 has slaves.
Not checking slave lag because no slaves were found and --check-slave-lag was not specified.
Operation, tries, wait:analyze_table, 10, 1copy_rows, 10, 0.25create_triggers, 10, 1drop_triggers, 10, 1swap_tables, 10, 1update_foreign_keys, 10, 1
Altering `employees`.`salaries`...
Creating new table...
Created new table employees._salaries_new OK.
Altering new table...
Altered `employees`.`_salaries_new` OK.
2018-08-28T14:37:01 Creating triggers...
2018-08-28T14:37:01 Created triggers OK.
2018-08-28T14:37:01 Copying approximately 2838426 rows...
Copying `employees`.`salaries`:  74% 00:10 remain
2018-08-28T14:37:41 Copied rows OK.
2018-08-28T14:37:41 Analyzing new table...
2018-08-28T14:37:42 Swapping tables...
2018-08-28T14:37:42 Swapped original and new tables OK.
2018-08-28T14:37:42 Dropping old table...
2018-08-28T14:37:42 Dropped old table `employees`.`_salaries_old` OK.
2018-08-28T14:37:42 Dropping triggers...
2018-08-28T14:37:42 Dropped triggers OK.
Successfully altered `employees`.`salaries`.

2.3 使用optimize table命令,整理碎片。

运行OPTIMIZE TABLE, InnoDB创建一个新的.ibd具有临时名称的文件,只使用存储的实际数据所需的空间。优化完成后,InnoDB删除旧.ibd文件并将其替换为新文件。如果先前的.ibd文件显着增长但实际数据仅占其大小的一部分,则运行OPTIMIZE TABLE可以回收未使用的空间。

mysql>optimize table account;
+--------------+----------+----------+-------------------------------------------------------------------+
| Table        | Op       | Msg_type | Msg_text                                                          |
+--------------+----------+----------+-------------------------------------------------------------------+
| test.account | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
| test.account | optimize | status   | OK                                                                |
+--------------+----------+----------+-------------------------------------------------------------------+
2 rows in set (0.09 sec)

3. 整理表碎片shell脚本

#!/bin/sh
socket=/tmp/mysql3306.sock
time=`date +"%Y-%m-%d"`
SQL="select concat(d.TABLE_SCHEMA,'.',d.TABLE_NAME) from information_schema.TABLES d where d.TABLE_SCHEMA = 'employees'"optimize_table_name=$(/usr/local/mysql/bin/mysql -S $socket -e "$SQL"|grep -v "TABLE_NAME")echo "Begin Optimize Table at: "`date +"%Y-%m-%d %H:%M:%S"`>/tmp/optimize_table_$time.logfor table_list in $optimize_table_name
do  echo `date +"%Y-%m-%d %H:%M:%S"` "alter table $table_list engine=innodb ...">>/tmp/optimize_table_$time.log
/usr/local/mysql/bin/mysql -S $socket -e  "alter table $table_list engine=innoDB" done
echo "End Optimize Table at: "`date +"%Y-%m-%d %H:%M:%S"`>>/tmp/optimize_table_$time.log

输出内容

# cat  optimize_table_2018-08-30.logBegin Optimize Table at: 2018-08-30 08:43:21
2018-08-30 08:43:21 alter table employees.departments engine=innodb ...
2018-08-30 08:43:21 alter table employees.dept_emp engine=innodb ...
2018-08-30 08:43:27 alter table employees.dept_manager engine=innodb ...
2018-08-30 08:43:27 alter table employees.employees engine=innodb ...
2018-08-30 08:43:32 alter table employees.salaries engine=innodb ...
2018-08-30 08:44:02 alter table employees.t1 engine=innodb ...
2018-08-30 08:44:17 alter table employees.titles engine=innodb ...
2018-08-30 08:44:28 alter table employees.ttt engine=innodb ...
End Optimize Table at: 2018-08-30 08:44:28

MySQL表碎片整理相关推荐

  1. 回收mysql表碎片_MySQL表碎片整理

    MySQL表碎片整理 1. 计算碎片大小 要整理碎片,首先要了解碎片的计算方法. 可以通过show table [from|in db_name] status like '%table_name%' ...

  2. mysql 碎片率_计算MySQL表碎片的SQL整理

    原标题:计算MySQL表碎片的SQL整理 这是学习笔记的第 2111 篇文章 在之前整理过一版MySQL的数据字典,整理了一圈,发现远比想象的复杂. 当然整理的过程不光是知识梳理的过程,也是转化为实践 ...

  3. oracle表稅片整理,oracle_Oracle表碎片整理操作步骤详解,高水位线(HWL)下的许多数据 - phpStudy...

    Oracle表碎片整理操作步骤详解 高水位线(HWL)下的许多数据块都是无数据的,但全表扫描的时候要扫描到高水位线的数据块,也就是说oracle要做许多的无用功!因此oracle提供了shrink s ...

  4. mysql碎片整理innodb_Innodb表碎片整理

    最近的数据库集群剩余容量不足,又开始了数据结转之路,主要干两件事情 1.结转数据,根据业务设定数据保留的时长,在时长之外的结转 2.对结转外的数据表进行碎片整理 因为数据结转,会造成大量的碎片,不进行 ...

  5. MySQL表碎片化(Table Fragmentation)以及处理

    关于MySQL中表碎片化(Table Fragmentation)产生的原因: 简单总结一下,MySQL Engine不同,碎片化的原因可能也有所差别.这里没有深入理解.分析这些差别.此文仅以Inno ...

  6. mysql索引碎片整理_MysqL碎片整理优化

    先来说一下什么是碎片,怎么知道碎片有多大! 简单的说,删除数据必然会在数据文件中造成不连续的空白空间,而当插入数据时,这些空白空间则会被利用起来.于是造成了数据的存储位置不连续,以及物理存储顺序与理论 ...

  7. 试试mysql数据碎片整理吧解决astgo经常死机变慢的问题

    使用SSH之类的工具或navicat连接数据库后(注意:是链接数据库后哦,不是直接SSH后就弄,这样提示命令错误的) 需要安装Astgo 7.0 7.3 8.0 V2015 V2016可以联系QQ或微 ...

  8. mysql文件碎片整理_对数据库磁盘驱动器进行碎片整理 | Microsoft Docs

    对 SQL Server 数据库磁盘驱动器进行碎片整理 12/02/2020 本文内容 本文提供了有关 SQL Server 数据库驱动器的碎片整理的一些指南. 原始产品版本:   SQL Serve ...

  9. oracle表碎片整理

    记录一次oracle 11g整理表的命令 Oracle版本:Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Prod ...

最新文章

  1. 对ZNNT-5NM力矩传感器进行标定
  2. KVM基础功能——Cpu配置
  3. sscanf用法(转)
  4. 皮一皮:原来网恋就是这个感觉...
  5. ios中MKHorizMenu用法
  6. Docker Review - dockerfile 实战_使用dockerfile制作tomcat镜像
  7. 关于fckEditor的功能配置-PHP版
  8. java编写WordCound的Spark程序,Scala编写wordCound程序
  9. C++笔记——有关内存对齐
  10. openssl解析国密X509证书
  11. log添加 oracle redo_添加Redo log Member/Group-Oracle
  12. 如何使用Python numpy.where()方法
  13. Php区分自然量跟aso量,ASO优化——判断下载量与评论的比例关系
  14. 水星d128路由器虚拟服务器,幻影D128路由器怎么设置?
  15. 瘦了红颜, 多了寂寞
  16. randn函数 python_Python numpy matrix randn()用法及代码示例
  17. 手指静脉图像分类识别
  18. 2023国自然已审核,预祝8月上榜
  19. JS实现对中文字符串的转码
  20. 杰理之充电芯片选型【篇】

热门文章

  1. 太极股份:深耕细作 “互联网+监管”大有可为
  2. new delate he typedef的含义
  3. 搭建自己的pdf在线预览工具
  4. 金融第三方网银在线支付通道及支付通道被攻击的解决方案
  5. VC+Qt运行时,显示*.dll不是有效的win32应用程序怎么解决
  6. Python数据分析库pandas基本操作
  7. 路由器的登陆界面登陆过慢的原因
  8. rbw设计_VBW与RBW
  9. eap方法 华为手机怎么连wifi_如何以编程方式在Android中安装CA证书(用于EAP WiFi配置)?...
  10. 机器人技术第三次作业:用面向对象的思维设计相关类,从而实现直线与直线、直线与圆、直线与矩形的交点。