Mysql 在SQL中存储大量传感器数据,优化查询性能

Mysql 在SQL中存储大量传感器数据,优化查询性能,mysql,sql,performance,sensors,bigdata,Mysql,Sql,Performance,Sensors,Bigdata,我需要存储不同位置的传感器数据(不同的工厂,不同的房间,每个不同的传感器)。数据定期从工厂的现场设备下载,该设备收集所有传感器传输的数据 传感器数据如下所示: collecting_device_id, sensor_id, type, value, unit, timestamp 类型可以是温度,单位可以是摄氏度收集设备id将识别工厂 有很多不同的东西(=类型)正在被测量 我将收集大约5亿到7.5亿行,然后对它们进行分析 这里有一个问题如何将数据存储在SQL数据库中(比如AWS RDS上的M

我需要存储不同位置的传感器数据(不同的工厂,不同的房间,每个不同的传感器)。数据定期从工厂的现场设备下载,该设备收集所有传感器传输的数据

传感器数据如下所示:

collecting_device_id, sensor_id, type, value, unit, timestamp
类型
可以是温度,
单位
可以是摄氏度<代码>收集设备id将识别工厂

有很多不同的东西(=类型)正在被测量

我将收集大约5亿到7.5亿行,然后对它们进行分析

这里有一个问题如何将数据存储在SQL数据库中(比如AWS RDS上的MySQL InnoDB,如果需要大型计算机):

在考虑未来查询的查询性能时,是否最好将这些数据存储在一个巨大的表中,就像它来自传感器一样?或者将其分布到各个表(工厂表、温度表、湿度表等等,所有标准化的数据)?或者为数据点提供一个包含不同字段的宽表

是的,我知道,如果不知道这些问题,很难说“更好”。以下是更多信息和我思考过的一些事情:

  • 没有固定的数据流,因为数据每2天分块上传一次(上传时写了很多,其余时间根本没有写),所以我猜索引维护不会是一个大问题
  • 我将尽量减少预先插入的数据量(以后可以轻松复制的数据,不添加额外信息的数据,…)
  • 应该执行的查询还没有定义(我知道,设计查询在性能方面有很大的不同)。这是一项探索性的工作(因此我们不知道将要询问什么,也无法轻松地预先计算值),因此,有一次您希望将一个时间范围内的一种类型的数据点与另一种类型的数据点进行比较,另一次您可能希望比较工厂中的房间,计算相关性,找到重复项,等等
  • 如果我有多个表并规范化所有查询,那么查询将需要大量的连接(这可能会使所有查询都非常慢)
  • 查询主要需要在整个~5亿行数据库上执行,很少在单独下载的子集上执行

  • 很少有用户(不进行预优化。如果你不知道查询,那么你就不知道查询。现在很容易做出选择,这会减慢某些查询子集的速度。当你知道如何查询数据时,你就可以进行优化——之后很容易进行规范化(例如,将温度数据提取到相关表格中。)现在,我建议您将其全部放在一个表格中


    <>你可以考虑按日期划分数据,或者如果你还有其他方法可能有用的话(录音设备?)。如果您有资源,通常会对这种大小的数据进行分区。

    不要进行预优化。如果您不知道查询,那么您就不知道查询。现在很容易做出选择,这会减慢某些查询子集的速度。当您知道如何查询数据时,您就可以进行优化—事后很容易进行规范化(例如,将温度数据提取到相关表格中。)现在,我建议您将其全部放在一个表格中


    <>你可以考虑按日期划分数据,或者如果你还有其他方法可能有用的话(录音设备?)。如果您有足够的资源,通常会对这种大小的数据进行分区。

    在考虑查询之后,您可能会意识到您并不真正需要所有的数据点。相反,例如,10分钟间隔的max/min/avg/etc可能就足够了。并且您可能希望在“温度过高”时发出“警报”值。这不应涉及数据库,但应涉及接收传感器数据的程序

    因此,我建议不要存储所有数据,而只存储摘要数据。这将大大减少磁盘需求。(您可以将“原始”数据存储到普通文件中,以防丢失。如果需要,重新处理原始文件将非常容易。)

    如果您决定将所有数据存储在表中,那么我建议您使用以下技巧:

    • (包括关于规范化的提示)
    • (如果您计划删除“旧”数据)(以后添加分区很痛苦)
    7.5亿行——每天?每十年?每月——没有太大的挑战

    通过每隔一天接收一个批次,将批次加载到临时表、进行规范化、汇总等变得非常容易;然后将结果存储在汇总表中,最后复制到“事实”表(如果您选择将原始数据保留在表中)

    在阅读我的提示时,您会注意到,
    avg
    不是汇总的;相反,
    sum
    count
    是汇总的。如果您需要标准偏差,也可以保留平方和

    如果未能包含最终需要的所有汇总表,则重新处理事实表(或事实文件)以填充新的汇总表并不太困难。这是一项一次性任务。此后,每个数据块的汇总应使表保持最新

    事实表应该规范化(用于空间);摘要表应该进行某种程度的非规范化(用于性能)。具体的非规范化程度取决于大小、速度等,在这个讨论级别上无法预测

    “500M行上的查询”--设计汇总表,以便所有查询都可以针对它们进行。一个经验法则:任何汇总表的行数都应该是事实表的十分之一

    索引…事实表应该只有一个主键。(前100M行可以很好地工作;最后100M行的运行速度非常慢。这是您不想学到的一课。)