查看空间使用情况
RDS控制台
RDS MySQL的控制台中提供了多种查看实例空间使用情况的方法:
基本信息
在RDS控制台的“基本信息”页中会显示实例的总存储空间使用大小,但这里只有当前的空间使用总量,没有具体的各类数据分别占用空间大小的信息,也没有空间使用的历史信息。
监控与报警
在RDS控制台的“监控与报警”页中的“标准监控”->“资源监控”下,可以查看实例的各类数据占用的磁盘空间大小的信息,并且会显示各部分空间大小的历史变化曲线。
其中磁盘空间总体使用量即对应当前实例实际已经使用了的所有存储空间总量,它由如下四个部分组成:
数据空间使用量 | 数据文件总大小。 |
日志空间使用量 | 日志文总大小 |
临时文件空间使用量 | 临时文件空间的大小 |
系统文件空间使用量 | 共享表空间等文件的大小 |
数据库自治服务
在RDS控制台的“自治服务”->“一键诊断”->“空间分析”页中可以查看实例内更详细的空间使用情况,包括数据与日志的空间使用对比、空间使用的历史变化趋势、Top数据库和Top表的空间分配明细等。
这个列表中的统计,则是针对数据库中的表所使用的数据文件空间。其中“表空间”为“数据空间”、“索引空间”、“未使用空间”三部分之和,它们的具体含义如下:
保留大小 | 已保留给该表的所有空间总和,包括数据、索引及未使用的部分 |
数据空间 | 表中的数据使用的总空间 |
索引空间 | 表中的所有索引使用的总空间 |
未使用空间 | 已保留给该表但还未分配使用的空间 |
需要注意的是上面列表中的空间大小是从统计信息中采集的,和真实的空间大小可能会存在误差。
命令行如何查看表空间
执行SQL命令:show table status like 'table_name'
常见空间的问题
为什么空间大
索引太多
一般表上除了主键索引,还存在二级索引,二级索引越多,整个表空间越大,同时索引太多也会造成写入时IO吞吐会放大。
有大字段
如果表结构定义中有blob、text、很长的varchar等大字段,也会占用更大的表空间,建议将数据压缩以后再插入。
空闲表空间太多
这里指的是InnoDB表的碎片率高。InnoDB是按Page(16KB)管理表空间的,如果Page写满记录,然后部分记录又被delete sql删除,后续这些删除的记录位置又没有新的记录插入,就可能造成空间没有被很好的利用。可以通过SQL语句 show table status like 'table_name' 查看表上空闲的空间,如果空闲空间特别大,可以执行optimize table table_name语句整理表空间。
临时表空间或临时文件过大
semi join和distinct去重、不走索引的order by /group by等SQL,会使用临时表来做去重和排序分组,如果涉及的数据量特别大,可能导致临时表空间ibtmp1特别大。Select 是否会使用临时表可以explain查看执行计划,看是否包含 Using Temporary。
还有一种情况是DDL重建表空间时,如果表特别大,创建索引排序时产生的临时文件也会特别大。对于RDS 5.6和RDS 5.7不支持即时加字段,很多DDL是通过创建新表的实现的,DDL执行结束再删除老表,DDL过程中会同时存在2份表空间,所以对大表DDL需要注意实例的空间是否足够,否则空间不足会造成DDL失败。
空间优化方案
- 云盘会支持比本地盘实例更大的空间。
- PolarDB采用分布式存储也支持非常大的存储空间,且按需自动扩容。
- RDS 创建时选xengine引擎,xengine是支持高压缩比的存储引擎。
- 采用分析型数据库等。