时序数据是指按照时间顺序存储的数据,TimescaleDB是一个开源的、扩展了PostgreSQL的时序数据库扩展,本文就给大家详细的介绍一下基于PostgreSQL的时序数据库TimescaleDB的基本用法和概念,需要的朋友可以参考下

目录

时序数据是指按照时间顺序存储的数据。它在很多领域得到广泛应用,例如物联网、日志分析、金融交易等。为了高效处理时序数据,TimescaleDB应运而生。TimescaleDB是一个开源的、扩展了PostgreSQL的时序数据库扩展,它结合了关系型数据库和时序数据库的优势,提供了更好的时序数据管理和分析能力。

时间序列数据的挑战: 时间序列数据是指按时间顺序收集和记录的数据,如传感器、日志、金融数据等。这类数据在现实生活中广泛存在,但对于传统数据库系统来说,处理大规模和高性能的时间序列数据是一项具有挑战性的任务。

TimescaleDB的出现: TimescaleDB是一个构建在PostgreSQL之上的开源时间序列数据库,它采用了一种创新的方法来解决传统数据库在处理时间序列数据方面的限制。TimescaleDB利用了PostgreSQL的强大功能,并通过扩展超级表的方式提供了更好的性能和可扩展性。

一、TimescaleDB概述

TimescaleDB是一个在PostgreSQL之上构建的时序数据库,它利用了关系型数据库的成熟性和灵活性,并针对时序数据进行了优化。TimescaleDB通过使用分区表(hypertable)和连续聚集表(continuous aggregate)来处理时序数据,使得数据的存储和查询更加高效。

二、安装和配置

1. 安装TimescaleDB插件

安装TimescaleDB可以通过在PostgreSQL上加载TimescaleDB插件来完成。首先,确保已经安装了PostgreSQL数据库,并且具有管理员权限。然后,在命令行中执行以下步骤:

1

2

3

4

5

6

7

# 添加TimescaleDB的APT源

curl https://packagecloud.io/timescale/timescaledb/gpgkey | sudo apt-key add -

echo "deb https://packagecloud.io/timescale/timescaledb/ubuntu/ focal main" | sudo tee /etc/apt/sources.list.d/timescale_timescaledb.list

# 更新软件源

sudo apt-get update

# 安装TimescaleDB插件

sudo apt-get install timescaledb-postgresql-13

2. 创建TimescaleDB数据库

TimescaleDB的工作方式与传统的PostgreSQL数据库相似。我们可以使用createdb命令创建一个新的数据库,并在该数据库上加载TimescaleDB扩展:

1

2

3

4

5

6

# 创建一个新的数据库

createdb mydatabase

# 连接到该数据库

psql mydatabase

# 在数据库中加载TimescaleDB扩展

CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;

3. 扩展超级表功能

TimescaleDB中的基本数据管理单元称为超级表。超级表是基于普通表的一种特殊类型,它将时间序列数据根据时间进行分区和组织,从而实现更高效的查询性能。以下示例演示了如何创建一个超级表:

1

2

3

4

5

6

7

8

9

-- 创建超级表

CREATE TABLE conditions (

    time        TIMESTAMPTZ       NOT NULL,

    location    TEXT              NOT NULL,

    temperature DOUBLE PRECISION  NULL,

    humidity    DOUBLE PRECISION  NULL

);

-- 对超级表进行分区

SELECT create_hypertable('table_name', 'time_column');

创建Hypertable:TimescaleDB中的核心概念是Hypertable,它是一个逻辑表,负责将普通表划分成不同的时间段。其中,'table_name'是原始表的名称,'time_column'是存储时间信息的列。

三、数据写入和查询

1. 创建超级表

超级表的创建与普通表类似,但需要指定时间列。以下示例创建了一个包含时间列的超级表:

1

2

3

4

5

6

CREATE TABLE conditions (

   time        TIMESTAMPTZ       NOT NULL,

   location    TEXT              NOT NULL,

   temperature DOUBLE PRECISION  NULL,

   humidity    DOUBLE PRECISION  NULL

);

2. 超级表的分区

超级表的分区是TimescaleDB的一个重要特性,它可以根据时间将数据分散到不同的物理表中。通过分区,查询操作仅需要在相关的物理表上执行,从而提高查询性能。以下示例演示了如何为超级表添加分区:

1

2

-- 对超级表conditions按月份进行分区

SELECT create_hypertable('conditions', 'time', chunk_time_interval => INTERVAL '1 month');

3. 超级表的复制和副本

TimescaleDB支持复制和副本功能,可以在多个节点上创建超级表的副本,实现数据冗余和高可用性。以下示例展示了如何创建一个超级表的副本:

1

2

-- 在节点2上创建conditions超级表的副本

SELECT add_data_node('conditions', '2');

4. 插入数据

向超级表中插入数据与向普通表中插入数据类似。以下示例向超级表conditions插入一行数据:

1

2

INSERT INTO conditions (time, location, temperature, humidity)

VALUES ('2023-06-29 06:00:00', 'New York', 25.4, 60.2);

5. 更新和删除数据

在超级表中更新和删除数据与普通表相同。以下示例演示了如何更新和删除符合特定条件的数据:

1

2

3

4

-- 更新温度大于30的记录

UPDATE conditions SET temperature = 30.0 WHERE temperature > 30.0;

-- 删除湿度小于50的记录

DELETE FROM conditions WHERE humidity < 50.0;

6. 时间序列聚合函数

TimescaleDB提供了一系列内置的时间序列聚合函数,用于计算给定时间范围内的统计信息,如平均值、最大值、最小值等。以下示例展示了如何使用时间序列聚合函数:

1

2

3

4

5

6

-- 计算最近一小时的平均温度

SELECT time_bucket('1 hour', time) AS hour,

      AVG(temperature) AS average_temperature

FROM conditions

WHERE time > NOW() - INTERVAL '1 hour'

GROUP BY hour;

7. 查询和过滤数据

查询和过滤数据时,可以使用常规的SQL查询语句。以下示例展示了如何查询超级表中的数据:

1

2

3

4

-- 查询所有温度大于25的记录

SELECT *

FROM conditions

WHERE temperature > 25.0;

8. 其他数据查询

TimescaleDB提供了许多用于查询时序数据的功能,例如:

  • 查询最近一小时的数据:

1

SELECT * FROM table_name WHERE time_column > NOW() - INTERVAL '1 hour';

  • 聚合查询:

1

2

SELECT time_bucket('5 minutes', time_column) AS bucket, AVG(value_column) AS avg_value

FROM table_name GROUP BY bucket ORDER BY bucket;

以上查询将结果按5分钟为一个时间段进行聚合,并计算每个时间段内的平均值。

四、连续聚集表

连续聚集表是TimescaleDB的一个重要特性,它可以在后台自动维护预定义的聚合数据。通过使用连续聚集表,可以极大地提高大规模时序数据的查询性能。以下是创建和使用连续聚集表的示例:

1. 创建连续聚集表:

1

SELECT create_continuous_aggregate('ca_table', 'SELECT time_bucket('5 minutes', time_column) AS bucket, AVG(value_column) AS avg_value FROM table_name GROUP BY bucket');

2. 查询连续聚集表:

1

SELECT * FROM ca_table;

五、分区管理

TimescaleDB使用分区(partitioning)来管理大规模的时序数据。它可以将表按照时间范围进行自动划分,提高查询性能和数据的可维护性。以下是创建和管理分区的示例:

1. 创建分区:

1

SELECT add_hypertable_partition('table_name', TIMESTAMP '2023-06-01', TIMESTAMP '2023-07-01');

2. 管理分区:

  • 查询所有分区:

1

SELECT show_partitions('table_name');

  • 删除分区:

1

SELECT drop_partition('table_name', TIMESTAMP '2023-06-01');

3. 数据连续性和存储优化

TimescaleDB通过数据连续性来优化存储空间和查询性能。数据连续性指的是调整超级表的分区和存储策略,以确保相邻时间段的数据存储在一起,从而提高查询性能。

4. 数据保留策略

TimescaleDB允许定义数据的保留策略,以自动删除过时的数据。通过设置保留策略,可以控制超级表中数据的保存时长,以及是否自动删除过期数据。

六. 综合使用示例

1. 创建超级表并插入数据

假设我们有一个名为conditions的超级表,包含时间、地点、温度和湿度字段。以下示例演示了如何创建该超级表,并向其中插入一些数据:

1

2

3

4

5

6

7

8

9

10

11

12

CREATE TABLE conditions (

   time        TIMESTAMPTZ       NOT NULL,

   location    TEXT              NOT NULL,

   temperature DOUBLE PRECISION  NULL,

   humidity    DOUBLE PRECISION  NULL

);

SELECT create_hypertable('conditions', 'time');

INSERT INTO conditions (time, location, temperature, humidity)

VALUES

   ('2023-06-29 06:00:00', 'New York', 25.4, 60.2),

   ('2023-06-29 07:00:00', 'New York', 26.8, 58.9),

   ('2023-06-29 08:00:00', 'New York', 28.3, 57.1);

2. 查询最新的N条数据

假设我们想要查询最新的3条温度数据。以下示例演示了如何使用LIMIT子句和ORDER BY子句进行查询:

1

2

3

4

SELECT *

FROM conditions

ORDER BY time DESC

LIMIT 3;

3. 执行时间范围内的聚合查询

假设我们想要计算过去一小时内每分钟的平均温度。以下示例展示了如何使用时间序列聚合函数和时间戳桶函数进行查询:

1

2

3

4

5

SELECT time_bucket('1 minute', time) AS minute,

      AVG(temperature) AS average_temperature

FROM conditions

WHERE time > NOW() - INTERVAL '1 hour'

GROUP BY minute;

七、小结一下

通过使用TimescaleDB,我们可以高效地存储和查询时序数据,并利用连续聚集表和分区管理功能进一步提高性能和可维护性。 Timescale DB跟同类的其他数据库相比具有一些令人兴奋的功能:

  • 它建立在PostgreSQL之上(目前最好的开源关系数据库)。如果您的项目已经在运行PostgreSQL,Timescale可以重点考虑。
  • 通过熟悉的SQL语法进行查询,从而减少了学习难度。
  • 极快的写入速度-每秒数百万次的插入。
  • 数十亿行或PB的数据,对于Timescale来说没什么大不了的。
  • 模式具有真正的灵活性-可以根据需要选择关系模式或无模式。
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐