当前位置: 首页 > news >正文

表数据删一半,为什么表文件大小不变?

参数innodb_file_per_table

这个参数设置为ON,表示每个表数据单独存在一个文件中,这时如果执行drop命令,系统会直接删除表文件。

这个参数设置为off时,所有表的数据和索引都存在共享的.ibdata文件,即使表删掉了,磁盘空间也不会回收,而是将表数据标记为可复用。

系统表空间

所有表的数据和索引都存储在共享的.ibdata文件

数据删除其实是标记为可复用

每个b+数的叶子节点是一个数据页,一个数据页包含很多条记录,一条记录被删除时,仅仅是这个记录的位置被标记为可复用,不管是主键索引还是二级索引,数据都是按照索引的顺序排好的,当一条记录被标记为可复用时,当有一条记录可以插在这个被复用的位置上时,就直接复用了这个位置,但是如果这条记录不能插在这个位置上就不能复用,比如一个主键索引树上,一个数据页有R1(100,数据),R2(200,数据),R3(300,数据),当R2被删除标记为可复用时,有个记录为100~300之间的都能复用这个位置,但是超过这个范围的就不行了。

当一个数据页都被标记为可复用时,就没有范围了,当需要新开辟一个数据页时,直接复用这个数据页。

所以,即使我们使用delete删除一个表的所有记录,磁盘文件也是不会减小的,而是都标记成可复用。

而这些可以复用但是没被复用的空间就是空洞。

删除数据会产生空洞,插入数据也会

在数据页内的数据很紧凑的情况下(不是100,200,300而是1,2,3,4,5这种)

假如一个数据页A已经满了,这时再插入一个比较靠后的位置,就会把这个新数据和数据页A后面的记录放在另一个新申请的数据页中。这就导致了A后面的记录变成空洞。

更新索引上 的值是先删除一个旧的值,再插入一个新的值

这也会产生空洞

通过重建表来收缩表空间,填补空洞

使用alter table A engine=InnoDB命令来重建表

(MYSQL5.5之前,默认的隐含意思是alter table t engine=innodb,ALGORITHM=copy)

MYSQL5.5之前,这条语句的执行逻辑是这样的:

首先创建一个临时表B,再将A中的数据一条一条按照顺序读写到表B中

这时B中数据是按照顺序插入的,没有空洞。

最后将A和B互换(重命名),删除表B。完成表A的重建

Online DDL

在上面这个流程中,最耗时的就是拷贝数据这个部分了,这个过程中如果写数据到A中,就会造成数据丢失。

Online DDL: 在对表结构进行更改时(执行DDL语句),同时支持对表数据进行增删改查。

此时重建表的逻辑就变成了

(MYSQL5.5之后,默认的隐含意思是alter table t engine=innodb,ALGORITHM=inplace)

首先创建临时文件B,在拷贝数据到临时文件B期间,将对表A的数据增删改查记录到一个日志文件row log中。

在拷贝完成后,将日志文件对表A数据的更改应用到临时文件B中,这样临时文件B中的数据旧和是一样的了

最后用临时文件B替换表A的数据文件

注意到这里和MYsql5.5之前有个不同的点是,之前的B是创建的表,是在server创建的,而这里是创建的临时文件,是在innodb内部创建的。对于server来说没有将表A的数据迁移到其他表,因为inno代办对其数据文件进行了更换。是在原表上直接进行DDL操作,所以这种方式叫做inplace

DML写锁退化成读锁

这个流程中,在Alter 语句启动时会获取DML元数据写锁,防止其他线程来对这个进行结构的更改,同时DML写锁会阻塞数据的增删改查操作,但是读锁不会。所以在进行拷贝数据时,DML写锁会退化成DML读锁,DML读锁只会阻塞DML写锁,但是不会阻塞增删改查。

Online和inplace

DDL过程如果是Online的,就一定是inplace的

原因

因为Online DDl依赖于inplace算法,在重建表时,如果是使用的COPY模式,那就会创建新的表来作为临时中间表,这会阻塞增删改查,而inplace可以不创建新的表,仅仅是创建临时文件。

并且inplace在对DML写锁的持有上进行了优化,在进行拷贝数据到临时文件时就退化成读锁了。

但是一个DDL是inplace的,就不一定是Online的

原因

Online DDL指的是在进行DDL时不阻塞DML(数据的增删改查)。

即使是inplace地添加全文索引和添加空间索引时(在原表上创建索引而不创建临时表),仍然不能进行DML操作。

相关文章:

表数据删一半,为什么表文件大小不变?

参数innodb_file_per_table 这个参数设置为ON,表示每个表数据单独存在一个文件中,这时如果执行drop命令,系统会直接删除表文件。 这个参数设置为off时,所有表的数据和索引都存在共享的.ibdata文件,即使表删掉了&…...

MoCoOp: Mixture of Prompt Learning for Vision Language Models

文章汇总 当前的问题 1)数据集风格变化。 如图1所示,对于一个数据集,单个软提示可能不足以捕获数据中呈现的各种样式。同一数据集中的不同实例可能与不同的提示符兼容。因此,更**自然的做法是使用多个提示来充分表示这些变化**。 2)过拟合…...

YOLOv8 onnx 部署

本文是在win10系统下进行yolov8目标检测推理的过程记录。 yolov8 已经集成到OpenCV,可以通过两种方式调用,一种是直接通过OpenCV 调用,另外一种是通过onnx runtime(ort)调用。 1、安装cuda 、opencv 等依赖库,具体可以参考 Win1…...

在文件里引用目录文件下的静态资源图片不显示

问题&#xff1a;两种图片路径的指定方式&#xff0c;第一种能展示图片但第二种不能 两个 示例中&#xff0c;图片展示的差异。 在第一个示例中&#xff0c;图片路径是硬编码在 标签的 src 属性中的&#xff1a; <img src"../../assets/img/header01.png" style…...

vue使用 jsplumb 生成流程图

1、安装jsPlumb&#xff1a; npm install jsplumb 2、 在使用的 .vue 文件中引入 import { jsPlumb } from "jsplumb"; 简单示例&#xff1a; 注意&#xff1a;注意看 id 为"item-3"和"item-9"那条数据的连线配置 其中有几个小图片&#x…...

攻坚金融关键业务系统,OceanBase亮相2024金融科技大会

10月15-16日&#xff0c;第六届中新数字金融应用博览会与2024金融科技大会&#xff08;简称“金博会”&#xff09;在苏州工业园区联合举办。此次大会融合了国家级重要金融科技资源——“中国金融科技大会”&#xff0c;围绕“赋能金融高质量发展&#xff0c;金融科技创新前行”…...

《纳瓦尔宝典:财富和幸福指南》读书随笔

最近在罗胖的得到听书中听到一本书&#xff0c;感觉很有启发&#xff0c;书的名字叫《纳瓦尔宝典》&#xff0c;从书名上看给人的感觉应该财富知识类、鸡汤爆棚哪类。纳瓦尔&#xff0c;这个名字之前确实没有听说过&#xff0c;用一句话介绍一下&#xff0c;一个印度裔的硅谷中…...

C++ | STL | 侯捷 | 学习笔记

C | STL | 侯捷 | 学习笔记 文章目录 C | STL | 侯捷 | 学习笔记1 STL概述1.1 头文件名称1.2 STL基础介绍1.3 typename 2 OOP vs. GP3 容器3.1 容器结构分类3.2 序列式容器3.2.1 array测试深度探索 3.2.2 vector测试深度探索 3.2.3 list测试深度探索 3.2.4 forward_list测试深度…...

C函数基础

C语言中的函数教程 在C语言中&#xff0c;函数是一段组织好的、可重复使用的、用于执行特定任务的代码。函数可以提高代码的模块化和可重用性。以下是关于C语言中函数的详细教程。 1. 函数的定义与声明 1.1 函数定义 函数定义包括函数头和函数体。函数头包括函数返回类型、…...

html和css实现页面

任务4 html文件 任务5 htm文件 css文件 任务6 html文件 css文件 任务7 html文件 css文件...

Github_以太网开源项目verilog-ethernet代码阅读与移植(八)——移植工程分享

实验背景 第六篇计划是写项目中各个模块的实现和约束文件的编写&#xff0c;有的小伙伴有裁剪工程的需要&#xff0c;就先分享一个半成品以供参考&#xff0c;由于笔者水平有限&#xff0c;错误肯定会有&#xff0c;望批评指正。 实验内容 移植工程共享 实验步骤 工程一部…...

【大模型实战篇】大模型分词算法BPE(Byte-Pair Encoding tokenization)及代码示例

词元化是针对自然语言处理任务的数据预处理中一个重要步骤&#xff0c;目的是将原始文本切分成模型可以识别和处理的词元序列。在大模型训练任务中&#xff0c;就是作为大模型的输入。传统的自然语言处理方法&#xff0c;如基于条件随机场的序列标注&#xff0c;主要采用基于词…...

低功耗4G模组LCD应用示例超全教程!不会的小伙伴看这篇就够了!

希望大家通过本文的介绍&#xff0c;学会LCD显示屏与Air780E开发板结合使用的方法。利用LCD显示屏&#xff0c;你可以为你的项目增加丰富的显示内容&#xff0c;提升用户体验。记住&#xff0c;实践出真知&#xff0c;赶快动手尝试吧&#xff01;相信这篇教程对你有所帮助~ 本文…...

Java while语句练习 C语言的函数递归

1. /* public static void main(String[] args) {int[] arr {25, 24, 12, 98, 36, 45};int max arr[0];//不能写0for (int i 1; i < arr.length; i) {if (arr[i] > max) {max arr[i];}}System.out.println(max);}*//*public static void main(String[] args) {doubl…...

illustrator免费插件 截图识别文字插件 textOCR

随手可得的截图识别文字插件 textOCR&#xff0c;识别出来的文字可直接输入到illustrator的当前文档中&#xff1a; 执行条件 1、需截图软件支持&#xff0c;推荐笔记截图工具 2、截好图片直接拖入面板即可完成识别 ****后期可完成实现在illustrator选择图片对象完成文字识别。…...

提升数据管理效率:ETLCloud与达梦数据库的完美集成

达梦数据库的核心优势在于其强大的数据处理能力和高可用性设计。它采用先进的并行处理技术&#xff0c;支持大规模的数据操作&#xff0c;同时具备出色的事务处理能力和数据安全保障。此外&#xff0c;达梦数据库还提供了丰富的功能模块&#xff0c;如数据备份、恢复、监控等&a…...

头歌——人工智能(搜索策略)

文章目录 第1关&#xff1a;搜索策略第2关&#xff1a;盲目搜索第3关&#xff1a;启发式搜索 - 扫地机器人最短路径搜索第4关&#xff1a;搜索算法应用 - 四皇后问题 第1关&#xff1a;搜索策略 什么是搜索技术 人类的思维过程可以看作是一个搜索过程。从小学到现在&#xff0…...

gorm.io/sharding改造:赋能单表,灵活支持多分表策略(下)

背景 分表组件改造的背景&#xff0c;我在这篇文章《gorm.io/sharding改造&#xff1a;赋能单表&#xff0c;灵活支持多分表策略&#xff08;上&#xff09;》中已经做了详细的介绍——这个组件不支持单表多个分表策略&#xff0c;为了突破这个限制做的改造。 在上一篇文章中&…...

域渗透AD渗透攻击利用 MS14-068漏洞利用过程 以及域渗透中票据是什么 如何利用

目录 wmi协议远程执行 ptt票据传递使用 命令传递方式 明文口令传递 hash口令传递 票据分类 kerberos认证的简述流程 PTT攻击的过程 MS14-068 漏洞 执行过程 wmi协议远程执行 wmi服务是比smb服务高级一些的&#xff0c;在日志中是找不到痕迹的&#xff0c;但是这个主…...

C++进阶-->继承(inheritance)

1. 继承的概念及定义 1.1 继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要手段&#xff0c;他允许我们在保证原有类的特性基础上还进行扩展&#xff0c;通过继承产生的类叫做派生类&#xff08;子类&#xff09;&#xff0c;被继承的类叫做基类&a…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...