聊一聊 mysql 存储空间优化

641 阅读2分钟

背景

线上数据空间告警, 需要进行相关处理。

方案

  • 无脑扩容

优点:简单快速。缺点:对于单体数据库容量会存在上限, 如果不断增长会导致无法扩容。单表数据量过大会影响查询性能。浪费资源。

  • 数据归档

针对具体业务进行分析, 是否可以历史的一些数据进行删除, 来减少使用的空间

  • 分库分表

对于无法归档的任务则需要进行相应的分库、分表操作。能够突破单体数据库对容量的限制, 也不影响查询性能。缺点就是需要相关的改造。

处理过程

这里就简单聊一下数据归档需要做哪些事情。

  1. 空间分析

看看数据库中的哪些表占用了大量的空间。

SELECT
  TABLE_SCHEMA, -- 数据库名称
  TABLE_NAME,  -- 表名
  ENGINE, -- 引擎
  TABLE_ROWS, -- 行数
  DATA_LENGTH / 1024 / 1024 / 1024 as 'DATA_LENGTH(GB)', -- 表大小
  DATA_FREE / 1024 / 1024 / 1024 as 'DATA_FREE(GB)' -- 碎片空间大小
FROM
  INFORMATION_SCHEMA.tables
order by
  DATA_LENGTH desc
limit
  10
  1. 业务评估

找到 db 中的大表, 看下如果建立归档是否对业务产生影响, 同时确定归档条件。

  1. 建立归档任务

归档任务可以理解为就是一个定时任务, 定期执行 delete 语句。这里要注意, 执行 delete 语句时要分批次处理, 避免造成线上慢查。尽量将归档任务做的通用一点。例如:过滤条件, 执行时间, 批次删除数量, 批次间隔时长。

  1. 空间释放

在 mysql 中即使执行了 delete 语句, 我们可以看到数据库的存储空间并没有释放「mysql 本身机制的问题」。这时我们可以执行相关 DDL 语句对表进行重建, 释放对应的 data_freee. 当插入数据时, mysql 也会自动使用 delete 标记的空间

alter table ${table_name} engine = innodb;

总结

当数据量大了之后, 不可以避免的就会遇到各种各种样的问题。比如:存储资源不够用, 查询性能下降。这时候我们就要考虑进行改造。要么进行删除释放空间, 要么分库分表「本质上还是利用分布式的思想来解决单机的瓶颈」。