【问题标题】:best way to store time series data with an identifier in sqlite3在 sqlite3 中使用标识符存储时间序列数据的最佳方法
【发布时间】:2020-12-07 00:01:25
【问题描述】:

假设有许多不同的传感器,所有这些传感器在测量数据时都会将数据保存在数据库中,并且每个传感器都可以有更多条目。我正在寻找保存这些数据的最佳方法,以便以后可以最快地完成选择查询。类似

"CREATE TABLE IF NOT EXISTS DataTable (sensor_id TEXT, measured_value REAL, time_of_measuring REAL)"

基本上可以工作,但我想这不会很快选择。我知道主键,但它们可以防止重复,所以我不能只把 sensor_id 作为主键。我基本上是在寻找相当于保存这样的数据的 sqlite,但是在一个表中并且作为一个测量是一行:

data = {"sensor1":[x1,x2,x3], "sensor2":[z1,z2,z3]...}

我想像 ˇˇ 这样的东西可以为每个传感器插入多个值,但这对选择有帮助吗?

"CREATE TABLE IF NOT EXISTS DataTable (sensor_id TEXT NOT NULL, measured_value REAL, time_of_measuring REAL NOT NULL, PRIMARY KEY(sensor_id, time_of_measuring ))"

【问题讨论】:

    标签: sql sqlite datetime where-clause query-performance


    【解决方案1】:

    对于这个时间序列数据,相关的主(或唯一)键可能是(time_of_measuring, sensor_id)。这与您在问题结尾处的建议接近,但各列的顺序相反。

    从技术上讲,这可以防止传感器同时记录两个测量值,这似乎是与您的数据相关的业务规则。

    在查询速度方面:很大程度上取决于查询本身。假设您有如下查询:

    select sensor_id, measured_val, time_of_measuring
    from data_table
    where 
        sensor_id = ? 
        and time_of_measuring >= ?
        and time_of_measuring <  ?
    order by sensor_id, time_of_measuring
        
    

    此查询将利用主键索引,因为列与 whereorder by 子句的列相同。您可以将measured_val 添加到索引中以提高查询效率:

    create index data_table_idx1 
        on data_table(sensor_id, time_of_measuring, measured_val);
        
    

    作为另一个例子,考虑这个where 子句:

    where time_of_measuring >= ? and time_of_measuring <  ?
    

    sensor_id上没有谓词,但是time_of_measuring是索引的第一列,所以可以使用主键索引。

    作为典型的反例,以下where 子句不会使索引受益:

    where sensor_id = ?                         -- need an index where `sensor_id` is first
    where sensor_id = ? and measured_val >= ?   -- needs an index on "(sensor_id, measured_val)"
    

    【讨论】:

    • 最常见的查询是“where sensor_id=? ORDER BY rowid DESC LIMIT 5”,因此基本上是给定传感器的几个最新值。但是可能有数千个这样的传感器,所以我会把它们都放在一张桌子上。因此,我需要为每个传感器创建一个索引,例如“在 data_table(sensor_id) 上创建索引 data_table_idx1;”那会有帮助吗?在那种情况下,主键甚至不重要?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-10
    • 1970-01-01
    相关资源
    最近更新 更多