LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

MySQL为什么不建议使用delete删除数据?

zhenglin
2025年12月5日 15:12 本文热度 136


Extent 自动扩展策略

  1. 初始分配为 1 个 Extent
  2. 若总表空间 < 32MB,每次 +1 个 Extent
  3. 大于 32MB,则每次 +4 个 Extent


二、InnoDB 表空间类型

  1. 系统表空间 (ibdata1),保存内部字典等元数据。

  2. 独立表空间innodb_file_per_table=ON),每个表一个 .ibd 文件。

  3. Undo 表空间,存储 MVCC 的回滚段。


从 MySQL 8.0 起,支持自定义通用表空间

CREATE TABLESPACE tbs_hot

  ADD DATAFILE '/hot_data/tbs_hot01.dbf'

  INITIAL_SIZE = 10G

  AUTOEXTEND_SIZE = 1G

  MAX_SIZE = 32G

  ENGINE = InnoDB;

冷热分离

  • 热数据 (用户、订单) → SSD 表空间
  • 冷数据 (日志、归档) → HDD 表空间


三、实际演示:空间分配 & 回收

1. 创建空表

CREATE TABLE user (

  id           BIGINT PRIMARY KEY AUTO_INCREMENT,

  name         VARCHAR(20) NOT NULL,

  age          TINYINT      NOT NULL,

  gender       CHAR(1)      NOT NULL,

  phone        VARCHAR(16)  NOT NULL,

  create_time  DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP,

  update_time  DATETIME     NOT NULL

) ENGINE=InnoDB;


$ ls -lh user.ibd

-rw-r----- 1 mysql mysql 96K Nov  6 12:48 user.ibd

说明:空表首个 Extent(32 页)占用约 96KB。


2. 插入 10W 条

代码高亮:

CALL insert_user_data(100000);  -- 自定义存储过程批量插入


$ ls -lh user.ibd

-rw-r----- 1 mysql mysql 14M Nov  6 10:58 user.ibd

  • 分配了更多 Extent,总计约 896 页(≈14MB)。


3. DELETE 50K 条

DELETE FROM user LIMIT 50000;


$ ls -lh user.ibd

-rw-r----- 1 mysql mysql 14M Nov  6 13:22 user.ibd

  • 空间未释放,仍然保持 14MB。

  • InnoDB 只打 删除标记 (delete_flag),不进行物理回收。


四、DELETE 对查询性能的影响

初始查询(100W 条+索引)

代码高亮:

SELECT id, age, phone

  FROM user

 WHERE name LIKE 'lyn12%';

  • 执行时间:30ms

  • COST:10.499

  • 物理读:7,868,409

  • 逻辑读:7,855,239

  • 扫描行:22,226

  • 返回行:11,111


删除 50W 后再查


DELETE FROM user LIMIT 500000;

ANALYZE TABLE user;

SELECT id, age, phone

  FROM user

 WHERE name LIKE 'lyn12%';

  • 执行时间:50ms

  • COST:10.499

  • 物理/逻辑读:同上

  • 扫描行:22,226

  • 返回行:0

结论:大表删除半数数据后,查询成本和 I/O 基本不变,只是返回结果不同。


五、为什么不推荐大批量 DELETE

  • 空间不回收

    • .ibd 文件不缩小,Extents 保留
  • 页碎片

    • 随机删除/更新导致页分裂、空洞增加
  • 后续写入难用

    • 删除标记页只有在插入更小行时才会重用
  • 碎片回收代价高

    • ALTER TABLE … ENGINE=InnoDB:全表重建,I/O 密集、阻塞 DML


 

六、最佳实践与优化建议

1. 逻辑删除(标记删除)

ALTER TABLE user

  ADD COLUMN is_deleted TINYINT NOT NULL DEFAULT 0;


UPDATE user

   SET is_deleted = 1

 WHERE id = 123456;


-- 查询时统一过滤:

SELECT * 

  FROM user

 WHERE is_deleted = 0

   AND name LIKE 'lyn12%';

  • 优点:无需大规模物理删除,不引入碎片。


2. 分区归档

  • 按时间分区,定期交换分区、归档历史数据。

  • 在线 DDL + 元数据交换:零或极低阻塞。

代码高亮:

ALTER TABLE ota_order_bak

  EXCHANGE PARTITION p202301

  WITH TABLE ota_order_mid;

通过分区操作,瞬间移动大块数据,无需耗时 DELETE。


3. 权限隔离

  • 对业务账号仅授 SELECT, INSERT, UPDATE禁用 DELETE 权限。
  • 拆分微服务数据库,每个服务独立账号,避免误删。

CREATE USER 'svc_user'@'%'

  IDENTIFIED BY '…';

GRANT SELECT, INSERT, UPDATE

  ON db_user.*;

4. 专用归档系统

  • 对冷数据、历史日志,可考虑 ClickHouseElasticsearch 存储与清理。
  • 利用 TTL 自动淘汰旧数据。


七、总结

  • DELETE 大量数据不会缩减空间,反倒留下一堆碎片,影响索引与性能。

  • 逻辑删除 + 分区归档 才是大规模数据清理的良方。

  • 结合 权限控制专用归档系统 (ClickHouse 等),才能既保证性能,也不丢失历史记录。


参考文章:原文链接


该文章在 2025/12/5 15:12:42 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved