网易首页 > 网易号 > 正文 申请入驻

什么?还在用delete删除数据《死磕MySQL系列 九》

0
分享至

五、如何选择普通索引和唯一索引《死磕MySQL系列 五》

六、五分钟,让你明白MySQL是怎么选择索引《死磕MySQL系列 六》

七、字符串可以这样加索引,你知吗?《死磕MySQL系列 七》

八、无法复现的“慢”SQL《死磕MySQL系列 八》

参与了好几个项目开发,每个项目随着业务量的增大,MySQL数据日益剧增,例如其中一个项目中得用户足迹表,那是非常的疯狂,只怪我大意了,没有闪。

这篇文章我会从delete对性能的影响,以及如何以正确的姿势来删除数据。

在MySQL中Innodb存储引擎的表存在两部分,一部分是表结构,另一部分是表数据。

在MySQL8.0之前下都会存在.frm文件,在MySQL8.0之后就不存在了。这是因为MySQL8.0中已经允许把表结构定义放到数据字典中了,是用参数innodb_file_per_table来决定的。

/var/lib/mysql

表空间分为几种,系统表空间、用户表空间、undo空间。

系统表空间:MySQL内部的数据字典,如information_schema库下的数据。

用户表空间:自己建立的表结构数据

undo空间:存储Undo信息,用于快速回滚。

MySQL8.0之前表结构是在系统表空间存储的,在MySQL5.6.6后可以使用参数innodb_file_per_table来控制。

设置为off时,表数据是放在系统表空间中,也就是MySQL的数据字典放在一起。

设置为on时,innodb存储引擎的表数据存储在.idb文件中。

你知道表定义存储在哪里吗?

来到死磕MySQL系列的专用数据库kaka,新建一张表evt_sms。

猜一下创建的evt_sms表结构定义存储在哪里呢?

在information_schema库里边的TABLES中,执行查询

SELECT TABLE_NAME,TABLE_COMMENT FROM TABLES WHERE TABLE_TYPE='BASE TABLE';

我们自定义的表类型是。

TABLE_TYPE

说了这么是为了解释如果把设置为off,则表数据也会存放在这里。

innodb_file_per_table

问题:如果数据存在放共享表空间中,表删除了,空间会删除吗?

答案是不会的。

参数innodb_file_per_table设置为on数据存储在哪里呢?

一般情况下是在中,会看到你创建的数据库,进入到数据库中就能看到一张表对应一个ibd文件。

var/lib/mysql

数据就是存储在这里。

结论

在项目开始阶段,切记将innodb_file_per_table设置为on,这是正确的做法。

现在你应该知道Innodb存储引擎用的是B+树数据结构,如下图。

如果现在删了主键ID为4的这条记录,Innodb引擎会把ID为4的这条记录标记为删除,如果之后再插入ID为4的记录,可能会复用这个位置,但磁盘文件大小并不会缩小。

隐式字段

这里就牵扯到了mvcc中的一个知识点,MVCC实现原理是由俩个隐式字段、undo日志、Read view来实现的。

上文说的标记删除就是隐式字段中的delete flag,即记录被更新或删除,这里的删除并不代表真的删除,而是将这条记录的delete flag改为true。

在MVCC:听说有人好奇我的底层实现这篇文章中也给大家留下了一个伏笔,数据库的删除是真的删除吗?

问题:删了一个数据页的所有数据会怎么样

跟单条数据是一样的,整个数据页都是可以复用的。

记录的复用是仅限于符合范围条件的数据,例如上文删除的ID为4这条记录,如果在插入ID为4就会复用。

这里需要给大家再聊一个新的知识点,若相邻的两个数据页利用率都很低,系统就会把这两个数据页合并到一个页上,另一个数据页就会标记为可复用。

页合并

问题:使用delete把整个表的数据都删除了会怎么样

答案是,所有的数据页都会标记为可复用,但是磁盘文件大小是不会改变的。

经过添加数据后表数据已经达到近100W了,文件大小已经达到108M。

扩展

这里大家应该能看见,就是执行命令来的,作用是开始我们在MySQL窗口里边,但不想退出MySQL窗口查看MySQL表文件大小,然后就可以执行这个命令结束任务。

stopped

ctrl + z

查看完后可以在执行返回到MySQL窗口。

fg

假设刚刚直接执行ll命令查看文件,那么就需要手动计算文件大小,很不方便。

执行ll -h命令则可以直观的看到文件大小。

删除数据查看磁盘文件是否缩小

在第三小节中,我们演示了删除了100W数据后文件大小是没有改变的,也就是空洞问题影响的,接下来就解决这种问题。

问题:空洞是如何产生的?

到了这里都应该知道空洞是因为大量的增删改造成的。

解决思路

你可以新建一个evt_sms_copy表,然后根据主键ID递增的顺序,把数据从evt_sms读入evt_sms1中。

这样就可以达到因为空洞造成的磁盘文件大小无法收缩问题。

问题:为什么能解决呢?

因为evt_sms_copy是一张新的表,并且数据是以主键ID递增的,索引是紧促的,数据页利用率已经达到了最高峰状态,这样就起到了磁盘文件无法收缩问题。

上干货

直接执行alter table evt_sms engine = Innodb 命令来达到磁盘文件收缩。

这里需要跟大家聊一下不同版本处理不同。

在MySQL5.5之前,这个命令做的事情跟我们解决思路是一样的,不同的是evt_sms_copy是不用自己创建的。

在执行命令期间如有新增数据的话,会造成数据丢失,因为在MySQL5.5之前版本的DDL不是Online的。因此不能有数据的改动。

现在MySQL都已经更新到8版本了,如果你是新项目就直接用8版本,不要在用5.6以前的老版本了,咔咔在18年开始就已经在使用MySQL8.0版本了。

在锁那一期文章中跟大家聊了MySQL5.6在DDL操作做了优化,引入了Online DDL。

优化后的执行流程

  • 建立临时文件tmp_file,把表的B+树存储到临时文件中。若此时有对表的操作,则会记录在row log文件中。
  • 把数据从原表全部刷到临时文件后,此时临时文件的数据就跟原表的数据一致。
  • 最后用临时文件替换表A的数据文件。

Online DDL的由来

可以看到在收缩磁盘文件时有数据更新会记录在row log中,意思就是在收缩磁盘空间时是可以对表进行增删改查的。

注意点

在进行磁盘文件收缩的过程中,都会全表扫描原数据和新增临时文件,如果你的表非常大,会非常消耗IO和CPU。

因此,你要安全的做这个操作,可以使用开源的gh-ost来进行。

结论

当你想收缩因为大量增删改查而导致表磁盘文件非常大时就可以执行命令来达到收缩表空间的目的。

alter table evt_sms engine=Innodb

都应该知道,那么接下里就对本文提出的结论进行实际操作一下。

实践是检验认识是否具有真理性的唯一标准

  • 先执行结束MySQL任务窗口
  • ctrl + z
  • 执行查看此时表evt_sms磁盘文件大小为108M
  • ll -h
  • 执行返回到MySQL任务窗口
  • fg
  • 执行命令
  • alter table evt_sms engine=Innodb
  • 再执行,执行查看磁盘文件大小已经到了128k。
  • ctrl + z
  • ll -h

上图即是咔咔操作的全过程,得到的结论就是执行命令可以收缩由于大量增删改查的表引发的空洞问题。最终达到收缩表空间目的。

alter table ect_sms engine = Innodb

删除数据不要使用delete,而是使用软删除,做一个标记删除即可。

这样既不会出现空洞问题,也方便数据溯源。

每张表必备三个字段create_time、update_time、delete_time。

通过本期文章我们需要知道以下几点。

  • 通过大量增删改查的表会出现空洞
  • 干掉空洞需要执行alter table evt_sms engine=Innodb来解决
  • 使用delete删除数据只会做一个标记处理,并不会真正删除空间
  • 本文所有的结论都基于innodb_file_per_table = on

坚持学习、坚持写作、坚持分享是咔咔从业以来所秉持的信念。愿文章在偌大的互联网上能给你带来一点帮助,我是咔咔,下期见。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
20万股东傻眼!交易所灵魂拷问,股价瞬间跌停!A股又一家,锁定退市!

20万股东傻眼!交易所灵魂拷问,股价瞬间跌停!A股又一家,锁定退市!

侃故事的阿蚌
2024-05-28 02:33:03
摧毁S-400和击落苏-25,速度比俄将军被抓更快!

摧毁S-400和击落苏-25,速度比俄将军被抓更快!

移光幻影
2024-05-25 12:12:15
骗子的掌上玩物

骗子的掌上玩物

梳子姐
2024-05-27 10:54:24
易建联全家移居美国引起热议,移居美国不代表不爱国,你怎么看呢

易建联全家移居美国引起热议,移居美国不代表不爱国,你怎么看呢

星光娱乐h
2024-04-18 16:23:50
韦世豪妻子晒观赛Vlog:家属梅开二度,我最棒的生日礼物

韦世豪妻子晒观赛Vlog:家属梅开二度,我最棒的生日礼物

懂球帝
2024-05-27 21:46:16
网易号平台每日辟谣公告(五月二十七日第一则)

网易号平台每日辟谣公告(五月二十七日第一则)

网易号官方平台
2024-05-27 12:41:16
秦刚赞美夫人:她是很好的贤内助,以她的方式行事,最后都很顺利

秦刚赞美夫人:她是很好的贤内助,以她的方式行事,最后都很顺利

李昕言温度空间
2024-05-21 21:17:34
乌克兰得到一笔“前所未有”的援助

乌克兰得到一笔“前所未有”的援助

环球时报国际
2024-05-27 23:57:17
全剧终!杨振宁亮出底牌,翁帆万般无奈,只能独自扬帆起航

全剧终!杨振宁亮出底牌,翁帆万般无奈,只能独自扬帆起航

娱乐白名单
2024-05-26 18:17:30
不续费就无法永久关闭?奥迪回应车机弹窗问题

不续费就无法永久关闭?奥迪回应车机弹窗问题

观察者网
2024-05-27 13:56:07
记者:没了颂克拉辛泰国队四驱车变三蹦子,赢几个就看球员射术了

记者:没了颂克拉辛泰国队四驱车变三蹦子,赢几个就看球员射术了

直播吧
2024-05-27 19:28:09
许可馨她出嫁了,嫁给了外国人!

许可馨她出嫁了,嫁给了外国人!

娱乐看小娱
2024-05-27 09:23:33
华为突然官宣,5月26日,创新技术功能,支持任意鸿蒙系统手机

华为突然官宣,5月26日,创新技术功能,支持任意鸿蒙系统手机

奇奇怪怪的冒险
2024-05-27 02:27:35
章子怡晒戛纳vlog,工作间隙与女儿视频,杨幂和醒醒打招呼超有爱

章子怡晒戛纳vlog,工作间隙与女儿视频,杨幂和醒醒打招呼超有爱

侦探娱乐
2024-05-27 20:59:46
疯狂的同性生活:失去了肛门,感染了艾滋!

疯狂的同性生活:失去了肛门,感染了艾滋!

灰产圈
2024-05-27 00:41:34
华西医院赁可:怀念恩师石应康教授

华西医院赁可:怀念恩师石应康教授

医学界
2024-05-27 19:05:08
蔡斌出席澳门站发布会,正面回应朱婷是否首发,称不清楚其状态!

蔡斌出席澳门站发布会,正面回应朱婷是否首发,称不清楚其状态!

骑马寺的少年
2024-05-27 21:09:57
听到iPhone16最新爆料,我替果子捏了把冷汗,苹果15用户赢麻了!

听到iPhone16最新爆料,我替果子捏了把冷汗,苹果15用户赢麻了!

奇奇怪怪的冒险
2024-05-27 20:59:17
不到绝境不改革

不到绝境不改革

求实处
2024-05-12 23:33:46
2020年,那个被清华北大拒收的江苏文科状元,后来怎么样了?

2020年,那个被清华北大拒收的江苏文科状元,后来怎么样了?

马蹄烫嘴说美食
2024-05-27 22:21:30
2024-05-28 08:16:49
原来是咔咔丫
原来是咔咔丫
你为技术,技术为你
22文章数 48关注度
往期回顾 全部

科技要闻

刘强东为何此时重新定义“兄弟”?

头条要闻

中日韩领导人会议取得"重大成果" 日韩媒体高度关注

头条要闻

中日韩领导人会议取得"重大成果" 日韩媒体高度关注

体育要闻

阿根廷一代神锋,击碎了沙特的金元足球梦

娱乐要闻

赵丽颖辟谣新恋情,林更新晒照显暧昧

财经要闻

郑裕彤家族撑腰 小赢科技撮合放贷大赚

汽车要闻

硬又没那么硬?体验为满足更多人需求的深蓝G318

态度原创

艺术
家居
时尚
本地
数码

艺术要闻

穿越时空的艺术:《马可·波罗》AI沉浸影片探索人类文明

家居要闻

自由遐想 纯白色调成柔和透气的自然力场

四五十岁男人的夏日“反油腻”秘诀:衣宽松、色不花、多戴棒球帽

本地新闻

2024沈阳皇姑第二届半程马拉松

数码要闻

两颗i9-14900KS深度评测:探究不稳定的原因及解决办法

无障碍浏览 进入关怀版