【发布时间】:2020-12-29 20:06:58
【问题描述】:
我一直在调查运行两个数据库的客户端 AWS RDS 实例 (MySQL 5.7.26) 中的一些奇怪行为。我不是数据库工程师,所以这超出了我的想象。
在一年中,RDS 实例大小在 2 小时内增加了 3 次。颠簸在1GB 到8GB 范围内。从角度来看,RDS 实例分配了60GB。 Here is a screenshot of the cloudwatch 记录这些事件之一。
两个数据库具有相同的架构,一个用于测试,另一个用于实时环境。它们都由一个时间序列数据的主表组成。这是架构:
SHOW CREATE TABLE timeSeriesTable;
'CREATE TABLE `timeSeriesTable` (
`id` varchar(50) NOT NULL,
`device_id` int(11) DEFAULT NULL,
`timestamp` datetime DEFAULT NULL,
`server_timestamp` int(11) DEFAULT NULL,
`modified` int(11) DEFAULT NULL,
`deleted` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `sensor_id` (`sensor_id`),
KEY `timestamp` (`timestamp`)
)
ENGINE=InnoDB DEFAULT CHARSET=latin1'
活表统计如下:
column_count: 6
table_rows: 88749947
data_length: 5.8GB
index_length: 8.3GB
这里有很多可以优化的地方,但我目前主要关心的是避免将来出现类似的存储问题。其他说明:
- 当时主日志被禁用
- RDS 性能洞察已禁用
- 表大小的总和证实了 AWS 存储估计(让我认为问题与数据相关或与 MySQL 相关)
- 数据进入系统有两种方式,一种是程序化的,另一种需要用户认证
- 不同时间块的行数一致,任何时间点都没有异常大量的数据
- 事件间隔不均匀,因此不是计划作业
- 我正在启用查询日志记录以潜在地捕捉到这一点
更新
数据库重启后,可用存储空间神奇地增加了8GB。
【问题讨论】:
-
多少内存?
innodb_buffer_pool_size的设置是什么?我看到该表在磁盘上占用了大约 14GB。在峰值期间执行SELECTs的位置? -
我看到一个列
device_id,但在sensor_id上有一个索引。 -
@RickJames
innodb_buffer_pool_size读取:{DBInstanceClassMemory*3/4} 5242880-18446744073709551615,有一次我可以确认一个非常大的SELECT正在运行,RAM ->16GB和sensor_id和device_id是一样的东西(我的坏) -
改为运行
SHOW VARIABLES LIKE 'innodb_buffer_pool_size'; -
我添加到我的答案中。
标签: mysql amazon-web-services amazon-rds innodb