表空间 数据库_MySQL回表

表空间 数据库_MySQL回表本文介绍为什么删除了一部分表数据后,表文件大小不变,以及有哪些表空间回收的方式。

MySQL45讲之表空间回收 - flowers

前言

本文介绍为什么删除了一部分表数据后,表文件大小不变,以及有哪些表空间回收的方式。

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

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

对于一个数据页,删除了其中若干行数据,因为还有其他数据,数据页不会回收,并且,空出来的位置会复用。即使一个数据页数据都被清空,这个数据页也不会被回收,而是也用于复用,当需要新创建数据页时,会直接使用这个可复用的数据页。

那应该怎么回收表空间呢?答案是重建表。

表空间回收方式

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

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、删除临时表

注意,两种拷贝方式都需要额外的一份存储空间,所以,在存储空间不足的情况下,重建表会失败。

对于大表的重建,十分消耗 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 过程。

参考

  • [1] 为什么表数据删掉一半,表文件大小不变

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/5858.html

(0)
上一篇 2023-04-22 14:00
下一篇 2023-04-22

相关推荐

  • Python使用log10()函数对数值100进行对数变换

    Python使用log10()函数对数值100进行对数变换log10()函数是Python内置的数学函数之一,用于返回数字的以10为底的对数,即log10(x)返回的是log(x)以10为底的对数。在Python中,该函数的使用方法为:import math后直接调用math.log10(x)即可,其中x代表需要进行对数变换的数值。需要注意的是,在使用log10()函数时,x的取值不能为0或负数,否则会报错。

    2024-01-07
    107
  • MySQL中InnoDB和MyISAM引擎的对比

    MySQL中InnoDB和MyISAM引擎的对比目录 索引对比 锁对比 事务对比 并发 全文索引对比 外键 其他 一.索引对比 1.B+树概念 我们这里关注B+树的两个特性: 1. 叶子节点包含数据data(data并不特指数据库中的某一行数据,也

    2023-02-07
    157
  • Python中的Class:理解类和对象的基本概念

    Python中的Class:理解类和对象的基本概念在Python中,类可以看作是一个代码模板,它定义了一组属性(变量)和方法(函数),作为蓝本来生成对象。对象则是类的实例化,具有类的属性和方法。可以看做是类的具体化,每个对象都是独立的实体,拥有各自的属性和方法。

    2024-01-17
    100
  • 工作记录。制作了个简单的查询器,查询驴子导出的ed2k[亲测有效]

    工作记录。制作了个简单的查询器,查询驴子导出的ed2k[亲测有效]有时想查找下ed2k.db,用数据库查看软件总是不够方便的,干脆写了个搜索器。。方便自己搜记录。 就是个sqlite查询,按文件大小排序,mfc,list ,奥利给。

    2023-02-26
    165
  • pgpool-II 用户手册[通俗易懂]

    pgpool-II 用户手册[通俗易懂]简单通俗的来讲,pgpool-II 是一个位于 PostgreSQL 服务器和 PostgreSQL 数据库客户端之间的中间件。pgpool-II主要提供负载均衡、连接池、复制、并行查询等等功能。Pg

    2023-04-27
    256
  • python创建真正的多线程(python中的多线程)

    python创建真正的多线程(python中的多线程)线程也就是轻量级的进程,多线程允许一次执行多个线程,Python是多线程语言,它有一个多线程包,GIL也就是全局解释器锁,以确保一次执行单个线程,一个线程保存GIL并在将其传递给下一个线程之前执行一些操作,也就产生了并行执行的错觉。

    2023-11-29
    118
  • Python交互界面标题

    Python交互界面标题随着Python语言的普及和应用范围的扩大,越来越多的人开始使用Python进行编程开发。而Python的交互式界面也越来越受欢迎,它可以帮助程序员在开发过程中更加高效地编写和调试Python代码。

    2024-06-24
    47
  • 爬虫入门指南

    爬虫入门指南爬虫(英文名称:Web crawler),又称网络爬虫、网络蜘蛛,是一种按照一定规则自动的抓取万维网信息的程序或者脚本。爬虫是搜索引擎的核心组成部分之一,用于对目标网站进行数据抓取、提取和处理,常用于大规模数据采集、更新、监测和分析。

    2024-09-07
    30

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注