MySQL:将一个大表拆分为分区还是单独的表?
我有一个MySQL数据库,包含20多个表,但其中一个表非常大,因为它从不同的传感器收集测量数据。它在磁盘上的大小约为145 GB,包含超过10亿条记录。所有这些数据也被复制到另一台MySQL服务器 我想把数据分成更小的“碎片”,所以我的问题是下面哪种解决方案更好。我会使用记录的“时间戳”将数据除以年份。几乎所有在此表上执行的SELECT查询都在查询的“where”部分包含“timestamp”字段 以下是我无法决定的解决方案:MySQL:将一个大表拆分为分区还是单独的表?,mysql,database,partitioning,large-data,Mysql,Database,Partitioning,Large Data,我有一个MySQL数据库,包含20多个表,但其中一个表非常大,因为它从不同的传感器收集测量数据。它在磁盘上的大小约为145 GB,包含超过10亿条记录。所有这些数据也被复制到另一台MySQL服务器 我想把数据分成更小的“碎片”,所以我的问题是下面哪种解决方案更好。我会使用记录的“时间戳”将数据除以年份。几乎所有在此表上执行的SELECT查询都在查询的“where”部分包含“timestamp”字段 以下是我无法决定的解决方案: 使用MySQL分区并将数据按年份划分(例如分区1-2010、分区2-
device_id (INT)
timestamp (DATETIME)
sensor_1_temp (FLOAT)
sensor_2_temp (FLOAT)
etc. (30 more for instance)
所有传感器温度在同一时刻每分钟写入一次。请注意,大约有30个不同的传感器测量值记录在一行中。这些数据主要用于显示图形和一些其他统计目的。关于如何使用/查询数据或模式是什么样子,您没有说太多,但我试图补充一些内容
我强烈反对任何通常需要在一段时间后添加表或类似内容的方法。像往常一样,在出现性能问题之前,我不会拆分任何内容 编辑:
我将明确地将表格重组为以下内容,而不是将其拆分:
device_id (INT)
timestamp (DATETIME)
sensor_id (INT) -- could be unique or not. if sensor_id is not unique make a
-- composite key from device_id and sensor_id given that you
-- need it for queries
sensor_temp (FLOAT)
如果数据增长很快,并且您希望很快生成TB的数据,那么使用NoSQL方法会更好。但那是另一回事。好吧,如果你希望得到一个新的答案,那意味着你可能读过我的答案,我听起来像一张破唱片。有关分区有助于提高性能的少数用例,请参阅。你的听起来和这4个案子都不一样 收缩
设备\u id
INT
为4字节;你真的有数百万台设备吗TINYINT UNSIGNED
为1字节,范围为0..255SMALLINT UNSIGNED
为2个字节,范围为0..64K。那会使桌子缩小一点
如果您真正的问题是如何管理这么多数据,那么让我们“跳出框框思考”。继续读下去
绘图。。。你在画什么日期范围
- “最后”小时/天/周/月/年
- 任意的小时/天/周/月/年
- 任意范围,不受日/周/月/年边界限制
- 一天的平均值
- 一天内的最大/最小值
- 烛台(等)的一天或一周或什么
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(对于当前数据量)
选择人力资源,
平均值,
米努瓦尔,
最大值
摘自总结
其中设备_id=?
和传感器_id=?
和hr>=?
人力资源<?+间隔20天;
将为您提供480小时的hi/lo/avg值;足够绘制图表吗?从汇总表中获取480行要比从原始数据表中获取60*480行快得多
获得一年的类似数据可能会扼杀一个绘图包,因此可能值得建立一个摘要摘要——分辨率为一天。大约是0.4GB
有几种不同的方法来构建汇总表;我们可以在你仔细思考它的美丽和阅读之后再讨论。也许收集一小时的数据,然后扩充汇总表是最好的方法。这有点像我们讨论的触发器
如果你有每小时的总结,你真的需要每分钟的数据吗?考虑把它扔掉。或者,可能是一个月后的数据。这将导致使用分区,但这只是为了其删除旧数据的好处,如的“案例1”中所述。也就是说,您将有每日分区,每晚使用DROP
和recognization
来改变“事实”表的时间。这将减少145GB的占用空间,但不会丢失太多数据。新占地面积:约12GB(每小时汇总+过去30天的逐分钟详细信息)
附:说明如何获得标准偏差。谢谢您的回答。我对我的答案做了一点修改,所以也许它给了我们一个大局
SELECT hr,
avg_val,
min_val,
max_val
FROM Summary
WHERE device_id = ?
AND sensor_id = ?
AND hr >= ?
AND hr < ? + INTERVAL 20 DAY;