MySql 数据空洞

news2025/1/12 19:44:59

大家在使用MySQL数据库的时候经常会发现新建的数据库及表用起来非常的流畅,但是当数据库使用一段时间后,随着数据量的增大再进行数据操作时经常会出现卡顿的现象,哪怕你的表中只有几十条数据也会出现查询时间过长的问题。

下图就是对一张表的查询,大家可以看出表中数据一共16行可是查询时间却用了45s多,你可能会说你的查询语句有问题,不要使用select * ,可是即使你使用了select id,name...来优化sql速度并不会提升。

在这里插入图片描述
眼尖的同学可能会发现,咦,你的id那一列怎么那么大呢?都到了3千多万。好吧,我承认为了引出今天的问题我是做了点手脚了。接下来就引出今天要给大家分享的Mysql数据空洞的问题。

1.数据空洞

MySQL的数据存储在表空间中,有的时候我们删除了一张表的一半的数据,但是发现表空间文件的大小并没有减少,这是什么原因呢?

当对一条数据执行delete操作时,MySQL将数据删除后,并未将数据占用的空间返还给操作系统,而是将当前空间标记为"可复用",当有新的数据插入时,则不会重新申请空间,而是插入到"可复用"空间中,这种"可复用"空间,称之为数据空洞。

MySQL官方文档对此的解释如下:

After deleting a large part of a MyISAM or ARCHIVE table, or making many changes to a MyISAM or ARCHIVE table with variable-length rows (tables that have VARCHAR, VARBINARY, BLOB, or TEXT columns).

Deleted rows are maintained in a linked list and subsequent INSERT operations reuse old row positions.

数据空洞的好处是尽可能的复用表空间结构,带来的问题也是显而易见,当删除数据后,表空间并未及时的释放,当长时间没有新的数据填充,会造成空间浪费的情况。

2.问题复现

为了深入的研究数据空洞的问题建议大家亲手实践一遍,只有亲自经历过记忆才能深刻,当你再次遇到类似的问题时会立刻想起相应的解决方案来。

1.新建一个测试表

create table emp(
id int(11) primary key auto_increment,
name varchar(20) not null,
deptId int(11),
salary float
);

2.插入一些测试数据

insert into emp(name,deptId,salary) values("Alice",1001,20394),("Carry",1002,20394),("scott",1001,3943),("Tiger",1003,10394),("Kalin",1003,30493),("Marry",1004,20394),("Tom",1003,10934),("Mike",1003,4039);

3.构造一批数据

insert into emp(name,deptId,salary) select name,deptId,salary from emp;

可以通过反复执行上面的sql语句来构建一批数据,当然你可以使用存储过程来实现,这里我使用了反复执行上面语句的方式来构建了3千多万条记录。
在这里插入图片描述
通过上图大家可以看出大量数据写库时时间的增长。

直到你表中的记录数达到3千多万后再清除一下表。

delete from emp;

然后再重新添加一些数据。

insert into emp(name,deptId,salary) values("Alice",1001,20394),("Carry",1002,20394),("scott",1001,3943),("Tiger",1003,10394),("Kalin",1003,30493),("Marry",1004,20394),("Tom",1003,10934),("Mike",1003,4039);

查看一下表的存储空间,虽然只有十几条数据,可是存储空间却达到了700多M,这700多M就是数据空洞产生的了,这也是我们表中虽然只有十几条数据可是查询却花了40多秒的原因了。

在这里插入图片描述

3.解决办法**

使用optimize命令可以解决数据空洞问题。

optimize table emp;

下图是执行完optimize命令后的截图。
在这里插入图片描述
再次查看表存储空间,你会发现大大的缩小了。
在这里插入图片描述
再次查询数据,速度得到了极大的提升,下图为证。
在这里插入图片描述

4.注意事项

Mysql是大家目前最常用的数据库,有时我们会频繁的插入删除数据,在频繁的进行表操作后可能会出现数据空洞的问题,判断的标准就是你表中实际存储的数据条数和存储空间产生了极大的差距,此时你就要考虑数据空洞的问题了,可以使用optimize命令对表进行优化。

但是optimize命令会锁表,所以大家也不要频繁的去使用这条命令,通过自己的判断数据表中的确出现了数据空洞时再执行,以防出现频繁锁表的新问题。

在这里插入图片描述

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

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

相关文章

如何修改电脑中图片的分辨率及DPI提高方法?

​当我们需要上传电子证件照到一些网上报名考试平台时,可能会发现这些平台对于电子证件照的分辨率有一定的限制,那么怎么改图片分辨率(https://www.yasuotu.com/dpi)呢?想要提高图片dpi可以使用压缩图的修改图片分辨率…

CocosCreator 之翻页容器(PageView)和滚动容器(ScrollView)的触摸冲突处理

来自博客 在开发的时候,我们需要一个既能翻页又能上下滑动的界面,这时候就会遇到翻页容器和滚动容器触摸冲突的情况。以下是博主这里的解决方法。 ScrollView和PageView层级关系如下: 在不做任何处理前,在ScrollView区域(上图白色区域)滑动,ScrollView可以正常上下滑动…

成功解决wget下载报错 : wget HTTP request sent, awaiting response... 403 Forbidden

成功解决wget下载报错 : wget HTTP request sent, awaiting response... 403 Forbidden 问题描述解决方案原理什么是User Agent解决 问题描述 –2023-07-15 02:32:57-- https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-2023.03-Linux-x86_64.sh Resolving mi…

设计模式——状态模式

状态模式 定义 当一个对象内在的状态改变时,允许其改变行为,这个对象看似改变了其类 状态模式的核心是封装,状态的变更引起行为的变更,从外部看来就好像这个对象对应的类发生了变化一样。 优缺点、应用场景 优点 结构清晰。…

MiniGPT4系列之三模型推理 (Web UI):在RTX-3090 Ubuntu服务器推理

MiniGPT4系列之一部署篇:在RTX-3090 Ubuntu服务器部署步骤详解_seaside2003的博客-CSDN博客 MiniGPT4系列之二推理篇:在RTX-3090 Ubuntu服务器推理详解_seaside2003的博客-CSDN博客 MiniGPT4系列之三模型推理 (Web UI):在RTX-3090 Ubuntu服…

华为OD机试真题 Java 实现【红黑图】【2023Q1 200分】,附详细解题思路

目录 专栏导读一、题目描述二、输入描述三、输出描述四、补充说明五、解题思路六、Java算法源码七、效果展示1、输入2、输出 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷B卷)》。 刷的越多,抽中的概率越大&…

百度留痕是什么方法排名的

百度留痕是什么方法排名的,黑帽seo教学:谷歌外推搜索留痕关键词秒收录排名软件技术培训 #外推留痕 #黑帽seo #黑帽seo培训 今天给大家看一个百度留痕的一个链接,东西也很简单,其实就是前面的一个地址加后面的一个你的联系方式,你…

三菱plc以太网连接电脑步骤

大家好,今天要和大家分享一个在生产管理系统中的常见问题:如何更方便地上位机访问PLC。我们知道,三菱FX系列PLC好多型号常常不带网口,这给上位机访问带来了不小的麻烦。但是,通过一款名为捷米特JM-ETH-FX的转换器&…

全程干货不愧是Alibaba总结的《Java面试权威指南泰山版》。

随着Java这个行业的兴起,薪资成功的吸引了一大批人,不管是在家待业的、对自己现在工作不满意的、大学选错专业的、缺钱的、想自己学的等等这些人绝大部分都是选择了去学习Java,然后就导致现在培训结构大量的流水线化,带着你走完一…

前端性能优化---样式计算

理论 样式计算 第一步,匹配一系列的样式选择器 第二步,取出所有匹配后的样式规则,构造RenderStyle 步骤 我们的解决思路是 减少样式计算的相互作用,即样式重新计算 什么是 Recalculate Style?在浏览器每一帧的渲染流…

详解c++---c++11(下)

目录标题 default关键字delete关键字lambda表达式为什么会有lambda表达式lambda的用法多线程和lambdalambda的底层 可变参数模板emplace包装器为什么会有包装器包装器的使用 bind default关键字 C11可以让你更好的控制要使用的默认函数。假设你要使用某个默认的函数&#xff0…

【搜索引擎】提高Apache Solr 性能

这是一个关于我们如何设法克服搜索和相关性堆栈的稳定性和性能问题的简短故事。 语境 在过去的 10 个月里,我很高兴与个性化和相关性团队合作。我们负责根据排名和机器学习向用户提供“个性化和相关的内容”。我们通过一组提供三个公共端点的微服务来做到这一点&…

【docker】它们之间如何通信和阻止,以及容器的基本概念

此篇文章主要是简单讲解,docker之间的通信方式以及和如何阻止docker之间的通信 目录 1、如何docker通信1.1、网络连接1.2、链接(Linking)1.3、共享数据卷(Shared Volumes)1.4、服务发现和负载均衡 2、阻止docker通信2.…

微信公众号搭建内网穿透骨灰级教程

微信公众号是我们日常使用的小工具,很多企业都会去申请微信公众号,但为了及时获取推送消息,需要开发者自己去调用微信公共号接口进行功能扩展和对接, 接下来演示如何使用神卓互联内网穿透服务来生成公网访问地址,以便…

【运维工程师学习五】数据库之MariaDB

【运维工程师学习五】数据库 1、常用的关系型数据库2、C/S结构3、MariaDB图形客户端4、安装MariaDB5、启动MariaDB及验证启动是否成功6、验证启动——端口7、验证启动——进程8、MariaDB配置文件路径主配置文件解读: 9、MariaDB的配置选项10、MariaDB客户端连接1、在…

MWeb Pro for Mac(苹果电脑最好用的Markdown编辑器)安装教程

MWeb Pro是一款专业的Mac平台上的Markdown编辑器,可以帮助用户更加高效地书写和排版文本内容,支持多种文本格式的导入和导出,如HTML、RTF、PDF等,还支持实时预览和代码高亮等功能,为用户提供了非常优秀的Markdown编辑体…

02LINGO基本操作

某公司新购置了某种设备 6 台,欲分配给下属的4 个企业,已知各企业获得这种设备后年创利润如表 1.1 所示,单位为千万元。问应如何分配这些设备能使年创总利润最大,最大利润是多少? 甲乙丙丁1423426455376764788657986671086 甲公…

【Java进阶之路】LinkedList源码分析

概述 LinkedList也是我们经常使用的集合,本文就LinkedList的几个主要方法展开介绍,并结合几个图片来介绍几个重要操作。 基础属性 transient int size 0; //节点数量/*** Pointer to first node.* Invariant: (first null && last null) |…

windows上安装Vmware及Linux系统

Linux系统的安装 一、windows上安装Vmware 第一步:复制VMware软件包到Windows系统中 第二步:双击VMware安装包,进行软件的安装 第三步:勾选软件的许可协议 第四步:设置VMware安装路径以及勾选增强型的键盘程序 第五步…

Three.js环境光,平行光,点光源,聚光灯的创建和灯光辅助线的使用

Three.js中的灯光API使用 1.环境光(AmbientLight)2.平行光(directionalLight)3.PointLight(点光源) 4.聚光灯(SpotLight)5.材质平面(PlaneGeometry)用于接收(平行光和聚…