好吧,如果你希望得到一个新的答案,那就意味着你可能已经阅读了我的答案,而我听起来就像一张破唱片。看分区博客对于分区可以提高性能的少数用例。你的确实如此not听起来像这 4 种情况中的任何一种。
Shrink device_id
. INT
是 4 个字节;您真的拥有数百万台设备吗?TINYINT UNSIGNED
为 1 个字节,范围为 0..255。SMALLINT UNSIGNED
为 2 个字节,范围为 0..64K。这将使桌子缩小一点。
If your real问题是如何管理这么多数据,那么让我们“跳出框框思考”。请继续阅读。
绘图...您要绘制什么日期范围?
- “最后”一小时/天/周/月/年?
- 任意的小时/天/周/月/年?
- 任意范围,与日/周/月/年界限无关?
你在画什么图形?
- 一天的平均值?
- 一天中的最大/分钟?
- 日或周的烛台(等)或其他?
无论哪种情况,您都应该构建(并增量维护)包含数据的汇总表。一行将包含一小时的摘要信息。我会建议
CREATE TABLE Summary (
device_id SMALLINT UNSIGNED NOT NULL,
sensor_id TINYINT UNSIGNED NOT NULL,
hr TIMESTAMP NOT NULL,
avg_val FLOAT NOT NULL,
min_val FLOAT NOT NULL,
max_val FLOAT NOT NULL
PRIMARY KEY (device_id, sensor_id, hr)
) ENGINE=InnoDB;
一个汇总表可能为 9GB(对于当前数据量)。
SELECT hr,
avg_val,
min_val,
max_val
FROM Summary
WHERE device_id = ?
AND sensor_id = ?
AND hr >= ?
AND hr < ? + INTERVAL 20 DAY;
将为您提供 480 小时的高/低/平均值;足够绘制图表吗?从汇总表中抓取 480 行比从原始数据表中抓取 60*480 行要快得多。
一年内获取类似的数据可能会让绘图包感到窒息,所以它may值得建立一个摘要的摘要——并以一天的决心。大约是0.4GB。
有几种不同的方法来构建汇总表;在你思考它的美丽并阅读之后我们可以讨论这个问题汇总表博客。收集一小时的数据,然后扩充汇总表可能是最好的方法。这有点像讨论的触发器我的暂存表博客.
而且,如果您有每小时的摘要,您真的需要每分钟的数据吗?考虑把它扔掉。或者,也许是一个月后的数据。这导致使用分区,但是只是为了删除旧数据的好处正如“案例1”中所讨论的分区博客。也就是说,您将拥有每日分区,使用DROP
and REORGANIZE
每天晚上都会移动“Fact”表的时间。这将减少您的 145GB 占用空间,但不会丢失太多数据。新足迹:约12GB(每小时摘要+过去30天的每分钟详细信息)
PS:摘要表博客展示如何获得标准差。