mysql为什么不建议delete数据?

delete对性能会有影响,一般不建议硬性delete数据,而是标记deleted = 1这种软删除

为啥呢?

 

根据之前了解的mysql底层存储原理   链接: mysql底层存储及IO过程理解

最小存储单元page页,无论是非叶子节点page存的是索引key和指针,还是叶子节点存的是行数据

 

1.当删除大量数据时

MySQL内部不会真正删除空间,而且做标记删除,即将delflag:N修改为delflag:Y,commit之后会会被purge进入删除链表,

对于删除后的空闲空间, 如果下一次insert更大的记录,这块空间不会被重用。 如果插入的记录小于空间大小会被重用

 

2.当少量删除中间数据时

你在中间删了某些个值,实际上只是找到那个page页找到对应的数据做删除标记,并不会实际影响page页已经占的大小,这块空间可能也永远不会被利用,产生了内存碎片

导致索引频繁分裂,影响SQL执行计划的稳定性

 

总结就是 1:会产生内存碎片,浪费空间   2:会导致索引不连续,影响索引性能

alter table t engine=InnoDB  可将重建整张表的索引数据,将表里以前的一些索引空洞给一并压缩进行重新整合。

 

 

正确姿势:

使用deleted = 1 字段来软删除,保证索引连续性,

必要时,可将deleted = 0的字段完整迁移到新表,解决碎片问题

 

posted @ 2021-02-05 20:41  六小扛把子  阅读(1000)  评论(0编辑  收藏  举报