mysql空洞数据,Mysql 表空间和 数据页空洞

一、表空间

1、表空间: innodb 引擎存储的最高层; 存放所有的数据

2、独立表空间:Mysql 版本5.6 后默认开启的单表单空间

(1)Innodb 默认存储引擎页的大小为 16K ;默认表空间 大小为96k

(2)独立表空间 开启方式 innodb_file_per_table ON 从Mysql 5.6.6 开始,默认值 ON

二、数据页空洞

如果我们修改了 info表 的表结构 ,比如 给表添加注释,发现9440 Dec 14 09:59 info.frm

磁盘上的 frm 表结构文件 立刻被更新了。

那我们如果删除一行数据呢? 从文件更改时间上来看也是立刻修改了。180224 Dec 14 10:03 temp.ibd

但是 idb数据文件 大小 180224却没有改变

那么数据库的删除流程到底是怎么样的? 为什么我们删除一行,存储的ibd文件大小却没有改变,当我们点击 删除表的时候,SQl 引擎发生了什么?

1、Innodb 的删除

为什么 ibd 文件不会变小?

InnoDb 的数据存储类型是 B+树 ,B+树的叶子结点上 ,存储的是 数据页 ; 一页数据页存储的是 数据记录,假设一条数据记录占用 200字节 ,一页数据页大小为 16Kb ,那么一页可以存储80条数据记录 ,当某条数据记录,比如 ID = 300 的数据记录被删除了,实际上,引擎只会标记这条数据记录为删除,而不会将数据记录从磁盘上抹去,所以磁盘文件上的 ibd 文件不会缩小

一个数据页 Page A 上,总是存储着 ID从 X 到 X+N 的 数据记录, 如果 X 到 X+N 之间的数据记录被删除了,会留下一个数据空洞,那么插入的X 到 X+N 区间之间,且不在PageA上,就会复用这个数据页, 所以文件大小不会减少

如果删除了1整个数据页的所有记录,那么这整个数据页都会被复用,

所以删除和插入,其实是在数据页上,产生和填补空洞 的过程 ,经过删除更新插入的表,都可能会产生大量的空洞。

2、整理数据页的空洞

那么,当一张表被更新插入,产生了数据空洞之后,如何整理数据页,使得数据变得更紧凑呢?

可以采取重建表的操作 alter table,实际上这里是 引擎自动完成了 转存数据、交换表名、删除旧表的操作

mysql> alter table temp engine=innodb;163840 Dec 14 10:52 temp.ibd

3、测试数据页的增长效果

新建一张 new_test 表

CREATE TABLE `new_test` (

`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`name` char(255) DEFAULT NULL,PRIMARYKEY(`id`)

) ENGINE=InnoDB AUTO_INCREMENT=191 DEFAULT CHARSET=utf8mb4;

我们知道 初始 ibd文件 的大小默认是 96K ,inndb 默认单个数据页大小是16K,对 new_test 表进行数据增加,观察 ibd文件大小。

insert into new_test (name) value("leon”)

发现 当rows 增长时,ibd文件大小增长规律如下:

idb文件大小 VS rows

96k – 0~81

128k – 82~136

144k – 136~190

160k – 190~255

16K 增长对应 54条rows ,1条row算出来约等于 296.29b , 正好等于 char 255b + int(11) 44 = 299b 。

可以看出来的确是由连续的数据页组成数据的。

4、数据空洞的复用

为了数据空洞的复用的问题,我们来删除 new_test 表 1-180行中的 155-160 行 ,ibd文件 原始大小为 144KB,当我们删除 150-160 这时候,数据页就有了 10条ID 的空洞 ,此时表中ID是 : 0-149 161 -180 共计 170条, 那么这时候,插入20条 还是 10条 数据页呢 ?

测试可得。插入20条,ID到 201。表空间变为 160k,所以原来的数据页存在空洞 可以被复用(??待理解!!)

---按照计算应该一条数据是800b,有十条空洞,再加入10条,应该是144KB+0.8*10=152KB,160k不是说明原来的空洞没有复用上吗??

原文:https://blog.csdn.net/qq_28018283/article/details/85003657

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/346326.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

junit 5测试异常处理_在JUnit中处理异常的3种方式。 选择哪一个?

junit 5测试异常处理在JUnit中,有3种流行的方式来处理测试代码中的异常: 试捕习语 使用JUnit规则 带注解 我们应该使用哪一个?何时使用? 试捕习语 这个习语是最受欢迎的习语之一,因为它已在JUnit 3中使用。 Test…

python网站数据写入mysql_python网络爬虫抓取动态网页并将数据存入数据库MySQL

简述以下的代码是使用python实现的网络爬虫,抓取动态网页 http://hb.qq.com/baoliao/ 。此网页中的最新、精华下面的内容是由JavaScript动态生成的。审查网页元素与网页源码是不同。以上是网页源码以上是审查网页元素所以此处不能简单的使用正则表达式来获取内容。以…

交通流预测 | Matlab基于KNN-BiLSTM的交通流预测(对比SVR、LSTM、GRU、KNN-LSTM)

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 交通流预测 | Matlab基于KNN-BiLSTM的交通流预测(对比SVR、LSTM、GRU、KNN-LSTM) 程序设计 完整程序和数据获取方式:私信博主回复Matlab基于KNN-BiLSTM的交通流预测(对…

JMetro“ Metro”选项卡,Java的TreeView和ContextMenu(JavaFX)

我刚刚发布了JMetro的新更新,将版本升级到3.3.0。 在此更新中,您将找到: 新的TreeView Fluent设计系统(Metro)启发风格; 新的Tabs和TabPane FDS启发风格; 新的上下文菜单采用深色FDS启发的样…

蒙特卡罗计算积分matlab,matlab下二重积分的蒙特卡洛算法

%%monte_carlo_ff.m%被积函数(二重)function ffmonte_carlo_ff(x,y)ffx*y^2;%函数定义处end%%monte_carlo.m%蒙特卡洛计算二重积分function resultmonte_carlo(a,b,c,d,n,m)%先y后x积分,a是x积分下限,b是x积分上限,c是y积分下限,d…

数据挖掘原理与算法_技术分享|大数据挖掘算法之FPGrowth算法

程一舰数据技术处我们常说我们生活在信息时代,实际上,我们更多的还是生活在数据时代。因为从过去到现在累积了大量的数据,对数据的挖掘和分析也仅是从最近几年大数据和人工智能技术的发展而兴起。我们对现有数据价值的利用还远低于数据本身拥…

centos 程序 mysql数据库文件位置,CentOS 更改MySQL数据库目录位置

引言:由于MySQL的数据库太大,默认安装的/var盘已经再也无法容纳新增加的数据,没有办法,只能想办法转移数据的目录。下面我简单整理一下这几天把MySQL从/var/lib/mysql目录下面转移到/home/mysql_data/mysql下面具体操作1、首先我们…

neo4j数据浏览器_Neo4j:在Neo4j浏览器的帮助下探索新数据集

neo4j数据浏览器在查看新的Neo4j数据库时,我发现遇到的一件困难就是确定其中包含的数据的结构。 我习惯于关系数据库,在该数据库中您可以轻松获取表列表和外键,以便您将它们相互连接。 传统上,使用Neo4j时很难做到这一点&#x…

mfc中怎么集成文件_怎么把几个pdf合并并打印在一份文件中?

a为什么我们要把pdf文件合并呢?当然我们要知道什么是pdf文件才能进行更多的操作,Pdf是我们许多人都会用到的一种存储文件的格式,它的内容基本是以图像的形式表现,所以我们在播放和打印的时候可以不用担心出现格式错乱的问题。PDF格…

php中日期选择代码,实现JS日期时间选择器

这次给大家带来实现JS日期时间选择器,实现JS日期时间选择器的注意事项有哪些,下面就是实战案例,一起来看一下。flatpickr 是一个轻量级、注重精益、由 UX 驱动和可扩展的 JavaScript 日期时间选择器。下载 演示 GitHubflatpickr 不依赖于任何…

Jib –为Spring Boot应用程序构建docker映像

使用Jib为示例Spring Boot应用程序创建docker映像是如此容易,这让我感到惊喜。 让我首先将Jib与以前使用的方法进行对比。 我正在使用bmuschko出色的gradle-docker插件创建docker映像。 如果可以访问docker守护程序以及基于dockerfile或直接Dockerfile的gradle ds…

python中正则表达式是什么意思_python – 正则表达式中[^.] *的含义是什么?

我试图从以下文本中获得482.75&#xff1a;< span id “yfs_l84_aapl”> 482.75< / span>我使用的正则表达式是&#xff1a;regex ’< span id “yfs_l84 _ [^.] *”>(.&#xff1f;)< / span>‘它起作用了.但是我不明白的是为什么[^.] *可以在这里匹配…

php steam 第三方登录,Steam第三方登录

Steam第三方登录Laravel PHP7.3前端登录界面if(isset($steamprofile))window.οnlοadfunction(){var steamprofile {!!$steamprofile!!};var steamid {{$steamid}};if(steamid){$.post(/ajax/SocilaAuthLogin,{data:{userdata:steamprofile,type:steamLogin},},function(dat…

setitimer 创建两个定时器_UE4 Timer(定时器)相关源码分析

前言文章属于旧有文章搬运, 之前在csdn上面2019.11.6修改Timer是定时器, 用途:延时执行事件周期性执行事件参考官方文档Using TimersTimer可以...Timer能...Timer...... 编不下去了, 自己百度谷歌吧(手动狗头)TimerManagerTimer的管理类是FTimerManager, 是一个全局的Timer管理…

is array php,PHP 源码 — is_array 函数源码分析

php 中的 is_arrayphp 中的 is_array&#xff0c;它的签名是 is_array ( mixed $var ) : bool实现的源码在\ext\standard\type.c中可以找到PHP_FUNCTION(is_array)所处的位置&#xff0c;大概位于 273 行。在 PHP 中&#xff0c;这个系列的函数&#xff0c;是由很多个&#xff…

apache mahout_使用Apache Mahout创建在线推荐系统

apache mahout最近&#xff0c; 我们一直在为Yap.TV实施推荐系统&#xff1a;您可以在安装应用程序并转到“ Just for you”标签后才能看到它的运行情况。 我们以Apache Mahout为基础进行建议。 Mahout是一个“可扩展的机器学习库”&#xff0c;包含使用协作过滤算法的基于用户…

activitimq集群搭建_activitmq+keepalived+nfs 非zk的高可用集群构建

nfs192.168.10.32maast192.168.10.4savel192.168.10.31应对这个需求既要高可用又要消息延迟,只能使用变态方式实现nfs部署#yum install nfs-utils rpcbind#vim /etc/exports/data/activemq 192.168.10.31(rw,sync,no_root_squash,no_all_squash)/data/activemq 192.168.10.4(rw…

java50车架适合身高,【经验分享】身高与车架的选择

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼车架的长度&#xff1a;骑在车上&#xff0c;在正常握把时&#xff0c;眼睛、把立前端和前轮花鼓三点一线则说明车架长度正好&#xff0c;否则可通过更换不同长度的把立来调整长度。在Airborne网站上看到了度量身体个部位长度和计算…

Java应用程序的简单令牌认证

“我喜欢编写身份验证和授权代码。” 〜从来没有Web开发人员。 厌倦了一次又一次地建立相同的登录屏幕&#xff1f; 尝试使用Okta API进行托管身份验证&#xff0c;授权和多因素身份验证。 JSON Web令牌已Swift成为保护Web应用程序安全的标准&#xff0c;并取代了Cookie和会话…

element手机验证格式_基于Vue+elementUI实现动态表单的校验功能(根据条件动态切换校验格式)...

前言开发过程中遇到了一个需求&#xff0c;根据用户选择的联系方式&#xff0c;动态改变输入框的检验条件&#xff0c;并且整个表单是可以增加的在线访问:动态表单校验github(欢迎star): https://github.com/Mrblackant. ..思考几个问题1.整个表单是可新增的&#xff0c;所以要…