MySQL45讲之表空间回收

本文介绍了为什么在删除部分表数据后表文件的大小保持不变,以及如何回收表空间。

[En]

This article describes why the size of the table file remains the same after a part of the table data is deleted, and how to reclaim the tablespaces.

为什么删除表数据后,表文件大小不变

MySQL 采用的是标记删除,需要等待后台 purge 线程删除数据。但是,purge 线程删除数据后,表空间依然不会回收。

对于数据页,删除了几行数据,因为有其他数据,数据页不被回收,空闲的位置被重复使用。即使数据页被清空,数据页也不会被回收,而是被用于重复使用,当需要创建新的数据页时,直接使用可重用的数据页。

[En]

For a data page, several rows of data are deleted because there is other data, the data page is not recycled, and the vacant locations are reused. Even if a data page is emptied, the data page is not recycled, but is also used for reuse, and the reusable data page is used directly when a new data page needs to be created.

我应该如何循环表空间?答案是重建表格。

[En]

How should I recycle the tablespace? The answer is to rebuild the table.

表空间回收方式

重建表推荐使用 ALTER TABLE t ENGINE = InnoDB; 。在不同的 MySQL 版本中,这条语句的执行方式不同。

注意,在重建表的时候,InnoDB 不会把整张表占满,每个页留了 1/16 给后续的更新用。

Copy Table

MySQL5.5 之前采用 Copy Table 方式重建表,Alter 期间,只支持 DML 查询操作,不支持 DML 更新操作,语句为 alter table t engine=innodb, ALGORITHM=copy;

1、server 层创建与原表结构相同的临时表
2、根据主键递增顺序,将一行一行的数据读出并写入到临时表,直至全部写入完成
3、互换原表和临时表表名
4、删除临时表

Online DDL

MySQL5.6 开始采用 Inplace 方式重建表,Alter 期间,支持 DML 查询和更新操作,语句为 alter table t engine=innodb, ALGORITHM=inplace;。之所以支持 DML 更新操作,是因为数据拷贝期间会将 DML 更新操作记录到 Row log 中。

重建过程中最耗时的就是拷贝数据的过程,这个过程中支持 DML 查询和更新操作,对于整个 DDL 来说,锁时间很短,就可以近似认为是 Online DDL。

1、获取 MDL(Meta Data Lock)写锁,innodb 内部创建与原表结构相同的临时文件
2、拷贝数据之前,MDL 写锁退化成 MDL 读锁,支持 DML 更新操作
3、根据主键递增顺序,将一行一行的数据读出并写入到临时文件,直至全部写入完成。并且,会将拷贝期间的 DML 更新操作记录到 Row log 中
4、上锁,再将 Row log 中的数据应用到临时文件
5、互换原表和临时表表名
6、删除临时表

请注意,这两种复制方法都需要额外的存储空间副本,因此当存储空间不足时,重建表会失败。

[En]

Note that both copy methods require an additional copy of storage space, so rebuilding the table fails when there is insufficient storage space.

对于大表的重建,十分消耗 IO 和 CPU 资源。如果是线上服务,为了安全性考虑,建议使用 GitHub 开源的 gh-ost 来做。

Online和Inplace

Inplace 替换,表示在 InnoDB 内部完成了重建过程,不是在 server 层。

Online 采用的就是 Inplace 的重建方式。但是,Inplace 方式并不一定是 Online,比如添加全文索引时 alter table t add FULLTEXT(field_name); 就不是 Online 的,因为它会阻塞 DML 更新操作;而 Online DDL 一定是 Inlpace 方式的。

alter table、analyze table和optimize table解释

alter table t engine = innode;(也就是 recreate)就是 Online DDL 重建表过程;

analyze table t; 不是重建表过程,它只是对索引信息重新统计,会上 MDL 读锁;

optimize table t;是 recreate + analyze 过程。

Original: https://www.cnblogs.com/flowers-bloom/p/mysql45-recycle-table-space.html
Author: flowers-bloom
Title: MySQL45讲之表空间回收

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/508144/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • LeetCode 21. 合并两个有序链表

    将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 = [1,2,4], l2 = [1,3,4]输出:[1,…

    数据库 2023年6月11日
    0106
  • [LeetCode]13. 罗马数字转整数

    罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做…

    数据库 2023年6月9日
    0132
  • Redis-切片集群

    扩容的思路 纵向扩展 scale up: 一台8G的变成一台24G的 👍 简单 👎 受硬件条件的限制 👎 单机容量大对性能的影响,如Redis的fork操作耗时是和内存数据量正相关…

    数据库 2023年6月11日
    077
  • ElasticSearch的简单api介绍

    1:ElasticSearch是什么? Elasticsearch 是一个分布式的免费开源搜索和分析引擎 适用于包括文本、数字、地理空间、结构化和非结构化数据等在内的所有类型的数据…

    数据库 2023年6月6日
    083
  • 启程——博客之路

    憋了这么久还是忍不住开始写自己的博客了。。。之前总是看别人的博客,伸手党一个,但是时间久了,总有一些自己想说的话,想想分享一些技术、经验,也能记录自己的学习历程,毕竟编程这条路还很…

    数据库 2023年6月9日
    079
  • LeetCode刷题笔记-简单入门题

    分割平衡字符串 在一个 平衡字符串 中,’L’ 和 ‘R’ 字符的数量是相同的。 给你一个平衡字符串 s,请你将它分割成尽可能多的平…

    数据库 2023年6月11日
    094
  • PLSQL_developer安装与配置

    前言: 记录安装与配置操作 环境: 客户机:windows服务器:虚拟机中的windows server 2003/————&#82…

    数据库 2023年6月11日
    092
  • SpringBoot 集成 JSP

    导致我写这个博客的原因是 在SpringBoot支持的模板引擎thymeleaf 下 前台页面仅支持HTML 可能用一些其他的前端框架 1、我们首先在IDEA中搭建一个项目,搭建项…

    数据库 2023年6月9日
    0136
  • 读取Excel示例

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/EasyData/archive/2011/01/26/…

    数据库 2023年6月11日
    060
  • PHP array_reduce()

    array_reduce array_reduce() 将回调函数 callback 迭代地作用到 array 数组中的每一个单元中,从而将数组简化为单一的值。 示例一: 示例二:…

    数据库 2023年6月14日
    099
  • 我的第一本算法书 第一章

    1.1 决定数据顺序和位置关系的是数据结构 电话簿的数据结构 按获取顺序排序 按拼音顺序排序 添加简单 查询麻烦 查询简单 添加麻烦 两者结合 分别使用不同的表存储不同的首字母, …

    数据库 2023年6月11日
    098
  • CSS进阶内容——布局技巧和细节修饰

    CSS进阶内容——布局技巧和细节修饰 我们在之前的文章中已经掌握了CSS的大部分内容,但仍有一些内容我们没有涉略,这篇文章就是为了补充前面没有涉及的内容,为我们的知识做出补充并且介…

    数据库 2023年6月14日
    083
  • Dockerfile 构建镜像

    从 Dockerfile 构建镜像涉及三个步骤 创建工作目录 编写 Dockerfile 规格 使用 docker build 命令构建镜像 1. 创建工作目录 这个根据应用实际情…

    数据库 2023年6月14日
    067
  • 【MySQL】MySQL的安装、卸载、配置、登陆和退出

    1 MySQL安装 安装环境:Win10 64位软件版本:MySQL 5.7.24 解压版 1.1 下载 https://downloads.mysql.com/archives/…

    数据库 2023年5月24日
    094
  • [springmvc]ajax异步请求数据详细简单

    10.Ajax异步请求 Ajax即 Asynchronous Javascript And XML(异步JavaScript和XML在 2005年被Jesse James Garr…

    数据库 2023年6月16日
    085
  • 第二十章 AOP开发中的坑

    问题 //在同一个业务类中,一个业务方法调用另一个业务方法 //问题: login方法添加有额外功能 // register方法没有添加额外功能 public class User…

    数据库 2023年6月14日
    075
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球