一、基本使用
这里读者自行安装数据库:使用安装包立即开始 | TDengine 文档 | 涛思数据 (taosdata.com)
// 下载gz文件,解压
tar -zxvf TDengine-server-<对应版本>-Linux-x64.tar.gz
// 解压后启动
sudo ./install.sh
启动成功后,直接输入 taos 即可进入数据库:
建表语句同mysql一样,在终端中运行的 SQL 语句需要以分号(;)结束来运行,**
CREATE TABLE
**语句用于创建普通表和以超级表为模板创建子表。
CREATE DATABASE demo;
USE demo;
CREATE TABLE t (ts TIMESTAMP, speed INT);
INSERT INTO t VALUES ('2019-07-15 00:00:00', 10);
INSERT INTO t VALUES ('2019-07-15 01:00:00', 20);
SELECT * FROM t;
ts | speed |
========================================
2019-07-15 00:00:00.000 | 10 |
2019-07-15 01:00:00.000 | 20 |
Query OK, 2 row(s) in set (0.003128s)
创建数据库示例
创建了一个有 10 个 vgroup 名为 db 的数据库, 其中每个 vnode 分配 10MB 的写入缓存
create database if not exists db vgroups 10 buffer 10
查看系统中的所有数据库
SHOW DATABASES;
创建子表
CREATE TABLE [IF NOT EXISTS] tb_name USING stb_name (tag_name1, ...) TAGS (tag_value1, ...);
显示所有表
SHOW TABLES [LIKE tb_name_wildchar];
显示表创建语句
SHOW CREATE TABLE tb_name;
获取表结构信息
DESCRIBE [db_name.]tb_name;
显示当前数据库下的所有超级表信息
SHOW STABLES [LIKE tb_name_wildcard];
二、查询sql
1. 查询开始时间到及结束时间的记录:
select * from 表 where ts >= 开始时间 and ts <= 结束时间
select * from power.d1001 where ts >= "2018-10-03T06:38:05.000Z" and ts <= "2018-10-03T06:38:15.000Z"
2. 查询开始时间到及结束时间的第一条记录
查询开始值,可以使用first函数:select first(表字段) from 表 where ts >= 开始时间 and ts <= 结束时间(查询指定时间结束值使用last函数。)
select first(current) from power.d1001 where ts >= "2018-10-03T06:38:05.000Z" and ts <= "2018-10-03T06:38:15.000Z"
3. 数据切分查询(分组)
PARTITION BY part_list
** part_list** 可以是任意的标量表达式,包括列、常量、标量函数和它们的组合。
例如:将数据按标签 **location **进行分组,取每个分组内的电压平均值:
select location,avg(voltage) from power.meters partition by location
4. 窗口切分查询-INTERVAL
TDengine 支持按时间窗口切分方式进行聚合结果查询,比如温度传感器每秒采集一次数据,但需查询每隔 10 分钟的温度平均值。
其中窗口函数中可以指定查询窗口大小。根据需求,分别为: a (毫秒), b (纳秒), d (天), h (小时), m (分钟), n (月), s (秒), u (微妙), w (周), y (年)。
官方文档这块我认为比较难理解,这里我就以一个例子简单的使用一下:
假设我们要查询从 2023-08-01 00:00:00 到 2023-08-01 00:05:00 这段时间内的数据,返要查询每个 location 下电压的平均值,并且考虑到每秒的分区。
用正常的语法应该是:
SELECT location, AVG(voltage) FROM power.meters
WHERE ts >= '2023-08-01 00:00:00' AND ts < '2023-08-01 00:05:00'
GROUP BY location, (ts - MICROSECOND(ts) % 1000000);
这里的 MICROSECOND(ts) % 1000000 实际并不存在,是我们自定义的,用来获取时间戳的微秒部分,并确保每秒开始的时间点相同。
使用 窗口切分查询解决这个问题应该是:
SELECT location, AVG(voltage) FROM power.meters
WHERE ts >= '2023-08-01 00:00:00' AND ts < '2023-08-01 00:05:00'
partition by location INTERVAL(1s)
个人理解:
**INTERVAL(1s) 就是一个函数,用来定义时间段里的条件,而这里的partition by 相当于GROUP BY,只不过 INTERVAL(1s) 必须配合 partition by 使用。**
三、使用 taosBenchmark 测试
在终端执行
taosBenchmark,
这条命令很快完成 1 亿条记录的插入:
$ taosBenchmark
该命令将在数据库
test
下面自动创建一张超级表 **
meters
**,该超级表下有 1 万张表,表名为 **
d0
**到 **
d9999
**,每张表有 1 万条记录,每条记录有 **
ts
、
current
、
voltage
、
phase
** 四个字段,时间戳从 2017-07-14 10:40:00 000 到 2017-07-14 10:40:09 999,每张表带有标签 **
location
** 和 **
groupId
**,groupId 被设置为 1 到 10,location 被设置为
California.Campbell
、
California.Cupertino
、
California.LosAngeles
、
California.MountainView
、
California.PaloAlto
、
California.SanDiego
、
California.SanFrancisco
、
California.SanJose
、
California.SantaClara
或者
California.Sunnyvale
。
查询超级表 **
meters
**下的记录总条数:
SELECT COUNT(*) FROM test.meters;
查询 1 亿条记录的平均值、最大值、最小值等:
SELECT AVG(current), MAX(voltage), MIN(phase) FROM test.meters;
查询 location = "California.SanFrancisco" 的记录总条数:
SELECT COUNT(*) FROM test.meters WHERE location = "California.SanFrancisco";
查询 groupId = 10 的所有记录的平均值、最大值、最小值等:
SELECT AVG(current), MAX(voltage), MIN(phase) FROM test.meters WHERE groupId = 10;
对表
d10
按每 10 秒进行平均值、最大值和最小值聚合统计:
SELECT FIRST(ts), AVG(current), MAX(voltage), MIN(phase) FROM test.d10 INTERVAL(10s);
版权归原作者 明湖起风了 所有, 如有侵权,请联系我们删除。