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的字段完整迁移到新表,解决碎片问题