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

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

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

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

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

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

一、表空间

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

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

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

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

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

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

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

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

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

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

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

在information_schema库里边的TABLES中,执行查询SELECT TABLE_NAME,TABLE_COMMENT FROM TABLES WHERE TABLE_TYPE='BASE TABLE';

我们自定义的表类型是TABLE_TYPE。

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

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

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

答案是不会的。

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

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

数据就是存储在这里。

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

结论

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

二、数据删除流程

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

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

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

隐式字段

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

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

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

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

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

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

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

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

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

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

三、实践全表删除表文件大小不改变

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

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

扩展

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

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

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

问题:Linux如何把文件单位显示为M

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

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

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

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

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

为了直观看大文件大小变化,咔咔直接把表里边的数据全部删了,再看文件大小,还是108M。文件大小是没有变化的。

四、如何正确的减少磁盘文件

在第三小节中,我们演示了删除了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命令来达到收缩表空间的目的。

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

都应该知道实践是检验认识是否具有真理性的唯一标准,那么接下里就对本文提出的结论进行实际操作一下。

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

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

上图即是咔咔操作的全过程,得到的结论就是执行命令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

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/86602.html

(0)

相关推荐

  • 关于三胎政策,国家提倡三胎政策

    导语:为了积极应对人口老龄化,改善国家的人口结构问题。为了让生活更优质,让社会更平衡,我国进一步推出优化生育的政策。然而,自从出台了“可生三孩”的政策后,立即变成了全社会的焦点。

    生活 2021年10月25日
  • 当代安普瑞斯科技有限公司会受益吗?特斯拉计划将全球标准续航电动车换成磷酸铁锂电池。

    财联社(上海,编辑 周玲)讯,美东时间周三(20日),特斯拉在三季度投资者交流会上表示,特斯拉正在全球范围内,将所有标准续航版电动车都改用磷酸铁锂 (LFP) 电池。此举可能是特斯拉不必提高汽车售价而提高利润率的一种方式,特斯拉曾因多次调价而受到批评。

    科技 2021年10月23日
  • 湖南打造内陆开放高地,湖南省开放崛起战略

    来源:人民网-人民日报

    生活 2021年11月28日
  • 由滴滴公司美国上市之所想

    中国的网络出行公司真的一定要上市才能做大,做好吗?为了国家的信息安全,国防安全,网络出行公司们是还是请慎重考虑下吧?其实,中国有很多像华为一样没有上市的企业,现在经营得也不错。

    科技 2021年12月4日
  • 我的剖腹产经历,剖腹产的经历

    [撒花]刚生完孩子半个月给大家分享一下我的感受

    生活 2021年11月26日
  • 藤黄溶栓酶对高尿酸血症肾功能损伤保护作用的研究

    肾功能损伤是高尿酸血症(hyperuricemia,HUA)临床最常见并发症之一,体内血尿酸产生过多或肾脏排泄尿酸减少,尿酸盐达过饱和状态而沉积于肾间质和输尿管,从而引起肾脏病变HUA肾功能损伤主要病理学改变为慢性肾间质、肾小管病变,并伴有局部炎症反应发生,近年来,HUA并发的肾功能损伤发病率呈升高趋势,男性患者多于女性,其发病隐匿,早期无明显临床症状。临床上常用的化学药物多为别嘌醇、非布司他和苯溴马隆等,通过抑制尿酸生成和促进尿酸排泄来改善尿酸代谢,但对并发的肾功能损伤尚无确切疗效。糖尿病、HUA等代谢性疾病是中医药防治的优势病种,中医药及少数民族医药对其相关并发症具有较好的临床治疗优势。藤茶,又称莓茶、龙须茶、客家白茶,由显齿蛇葡萄Ampelopsis grossedentata(Hand. -Mazz. )W. T. Wang的嫩枝叶加工而成,具有清热解毒、活血通络的功效,主要分布于四川、贵州、湖南、湖北、广西等少数民族地区,具有药食同源之性。藤茶含有黄酮类、多糖类、酚类、氨基酸等多种活性成分,其黄酮类成分含量最为丰富,主要有二氢杨梅素、藤茶素、槲皮素、杨梅素等,其中二氢杨梅素的质量分数高达35%,被认为是藤茶发挥保健功效的重要药效物质基础。现代药理学研究表明,藤茶及其总黄酮部位具有抗氧化、降血压、调血脂、抗动脉粥样硬化、心血管保护、抗肝癌等药理作用。课题组前期通过对藤茶民族习用地区大量走访和临床实践反馈后发现,藤茶作为药食两用植物,在多个少数民族地区均有治疗痛风和慢性肾炎,但其治疗HUA肾功能损伤的作用机制相关研究较少。因此,本研究采用分子对接技术,综合藤茶总黄酮中代表性活性成分,深入探讨药物组分与尿酸生成和排泄相关蛋白靶点的相互作用,并建立腺嘌呤联合乙胺丁醇致HUA肾功能损伤大鼠模型进行验证,系统探讨藤茶总黄酮提取物对HUA肾功损伤的保护作用,以期为少数民族地区药食资源藤茶的进一步保健开发提供科学依据。近年来,由于饮食习惯和生活条件的改变,人们大量摄入高嘌呤食物,HUA患病率逐年增加,成为仅次于糖尿病严重危害人类健康的“第四高”。肾功能损伤是HUA临床最常见并发症之一,尿酸是嘌呤代谢的最终产物,尿酸的生成与排泄之间的失衡是直接诱导HUA肾功能损伤的主要原因,维持正常的血尿酸水平对预防肾脏疾病的发生发展具有重要的临床意义。藤茶作为多民族地区药食保健资源具有丰富的活性成分,其开发价值较大。XOD和ADA是尿酸生成途径中的重要靶蛋白,在嘌呤分解代谢过程中发挥着重要作用,抑制其活性可以有效控制血清尿酸水平。肾脏是尿酸排泄的主要器官自由通过细胞膜,肾小管上皮细胞上的尿酸转运蛋白URAT1、GLUT9和ABCG2参与尿酸盐的分泌与重吸收,为肾脏调节尿酸代谢的重要靶点.本研究将AGTF主要活性成分与HUA的5个潜在治疗靶点(URAT1、GLUT9、ABCG2、XOD、ADA)进行分子对接模拟,结果显示AGTF中主要活性成分二氢杨梅素、杨梅素、槲皮素和藤茶素与疾病相关靶点均具有较好的结合活性,表明这些成分可能是AGTF中改善HUA及其肾功能损伤的潜在药效物质。其中,藤茶素的对接得分最高,其次是二氢杨梅素,目前对藤茶素的药理活性研究较少,而二氢杨梅素作,由于尿酸不能为AGTF的主要活性成分,除了在降血糖、调血脂、抑菌、抗炎、镇痛、抗氧化、抗肿瘤、保肝护肝、免疫调节等方面具有较好的药理活性,还能够显著降低小鼠血清中尿酸水平,具有保护和治疗肾脏损伤的作用,对接结果还发现,别嘌醇与5个受体蛋白都能自由结合,其中与XOD靶点的结合能最小,表明别嘌醇与XOD的相互作用最强,与其能够抑制XOD从而减少尿酸产生的报道一致,与别嘌醇的对接结果相比,AGTF的主要活性成分与5个受体蛋白发生相互作用的可能性均高于别嘌醇,提示AGTF在抗HUA及其肾功能损伤方面具有潜在的临床应用价值,AGTF可能通过二氢杨梅素、杨梅素、槲皮素和藤茶素等活性成分作用于URAT1、GLUT9、ABCG2、ADA和XOD靶点,发挥治疗HUA肾功能损伤的药效作用,体现了中药多成分、多靶点的特点。基于分子对接结果,本研究采用腺嘌呤和乙胺丁醇复合建立大鼠HUA肾功能损伤模型,通过体内实验进一步探讨了AGTF对HUA肾功能损伤的保护作用及机制。结果表明,AGTF组大鼠血清中XOD、ADA活性和尿酸、肌酐、尿素氮水平均显著降低,肾脏组织病理学改变明显减轻,表明AGTF具有较好的降低血尿酸水平、改善尿酸代谢、减轻高尿酸盐沉积对肾脏组织损伤的作用,其作用机制可能与调节尿酸盐转运蛋白URAT1、GLUT9和ABCG2表达,抑制炎症因子TNF-a、IL-1β、IL-6和TGF-β蛋白表达等途径有关。AGTF一方面能明显抑制URAT1、GLUT9转运蛋白的表达,阻碍肾近曲小管尿酸盐的重吸收;另一方面通过上调ABCG2转运蛋白的表达,增强肾近曲小管外侧膜上的尿酸盐转运速率,促进肾脏尿酸盐的排泄,协同降低尿酸水平、减少尿酸盐在肾小管的沉积,从而减轻肾功能损伤。过多的尿酸盐在肾脏的堆积会刺激肾小管上皮细胞,促进局部炎症反应,导致肾间质纤维化,AGTF能够显著降低大鼠肾脏中TNF-a、IL-1β、IL-6和TGF-β的蛋白表达,抑制炎症反应,保护肾功能,延缓肾脏间质纤维化。综上所述,本研究通过分子对接技术结合体内实验,发现AGFT不仅能够调节尿酸盐转运蛋白URAT1、GLT9和ABCG2的表达,降低大鼠血清中尿酸代谢相关指标水平,有效改善HUA和肾脏病理反应,同时还能抑制肾脏炎症反应,发挥对HUA肾功能损伤的保护作用。与分子对接结果一致,AGTF能够直接作用于XOD、ADA、URAT1、GLUT9、ABCG2关键靶蛋白,从而发挥其治疗作用,表明分子对接结果具有可靠性和合理性。曾运雄博士介绍:痛风是一种由于机体嘌呤代谢紊乱引发的尿酸过多或者是尿酸排泄减少,并在机体内蓄积沉淀所导致的一组代谢性疾病。随着人们生活水平的提高及饮食结构的变化,痛风发病率呈逐年上升的趋势。据保守估计,目前我国有高尿酸血症患者1. 2亿,患者人口接近总人口数的10%,其中北上广深等重点城市医院抗痛风药销售额增长率几乎每年都保持在30%以上。尿酸内源性产生约占80%,外源性产生约占20%.尿酸主要通过肾脏的排泄,以维持人体尿酸水平的正常。痛风患者血尿酸水平越高,其糖尿病、心衰、高血压、心梗以及肥胖的发生率也越高,与高血压、高脂血症、动脉粥样硬化、肥胖和胰岛素抵抗等疾病的发生密切相关,是当今世界尤其是中老年男性的常见病,已成为威胁人类健康的严重代谢性疾病。中医认为痛风是风湿顽痹证,主要是外感风寒湿邪,久病邪气痹阻经络,气血津液运行受阻。多因饮食工失宜,过食肥甘厚味,湿浊内蕴,日久化热所致。痛风的发病机制,主要与湿浊、痰淤、热毒有关。对于痛风的治疗目前多采用西药为主,常用的有秋水仙碱,非甾体类抗炎镇痛药,肾上腺糖皮质激素和丙磺舒等,此类西药虽然见效快,但大多治标不本,停药后病痛很容易又复发,而且此类药物往往毒副作用比较大,除可引起胃肠道反应外,长期服用还可能导致骨髓抑制、肝细胞损害、精神抑郁、上行性麻痹、呼吸抑制等等副作用。

    生活 2021年12月23日