最近公司在启用TDengine作为实时数据的存储数据库,目前这个数据库的使用方式,我还不是很熟悉,特此记录和总结一些使用技巧。
官方文档地址,按照文档描述,安装整体还是比较简单的,本文就不介绍安装过程了,附上官方地址:
https://docs.taosdata.com/get-started/package/
需要启动 taosd 和 taosadapter两个服务。
这里使用windows环境下 Taos Shell 工具进行测试,需要安装TDengine-client软件,如下图所示:
create user `用户名` pass `密码`;
如:
create user myuser pass "123456";
taos 数据库 root用户的默认密码为: taosdata,安装好taos数据库后,可以通过下语句修改密码。
alter user root pass `yourpassword`
如:
alter user root pass '123456';
taos -uroot -p密码
如:
taos -uroot -p123456 ;
keep 字段是指文件在表存储的时间,默认是天。
create database if not exists 库名 keep n days m blocks k;
#如:
create database if not exists mydb keep 365 days 10 blocks 4;
use 库名;
#如:
use mydb;
drop database [if exists] 库名;
#如:
drop database [if exists] mydb;
show databases;
alter database 库名 comp 位数;
#如:
alter database mydb comp 2;
alter database 库名 replica 数量;
#如:
alter database mydb replica 2;
alter database 库名 keep 天数;
#如:
alter database mydb keep 35;
alter database 库名 quorum 数目;
#如:
alter database mydb quorum 2;
alter database 库名 blocks 大小;
#如:
alter database mydb blocks 100;
先说明语法格式,后续会统一说明超级表,子表以及Tag的关系,统一建表进行操作展示。
创建STable, 与创建表的SQL语法相似,但需指定TAGS字段的名称和类型。说明:
create stable [if not exists] stb_name (time timestamp,column_name int ...) tags (column_name1 dataType,column_name2 dataType,....)
#如
create stable if not exists st(time timestamp, column_name int) tags (t1 nchar(50), t2 nchar(100));
SHOW STABLES [LIKE tb_name_wildcard];
#如:显示当前数据库下的所有超级表信息
show stables like "%super%
SHOW CREATE STABLE stb_name;
DESCRIBE [db_name.]stb_name;
#如
describe super_table ;
SHOW TABLE TAGS FROM stbname;
#如:
SHOW TABLE TAGS FROM st;
删除 STable 会自动删除通过 STable 创建的子表以及子表中的所有数据。
DROP STABLE [IF EXISTS] [db_name.]stb_name
修改超级表的结构会对其下的所有子表生效。无法针对某个特定子表修改表结构。标签结构的修改需要对超级表下发,TDengine会自动作用于此超级表的所有子表。
ALTER STABLE stb_name ADD COLUMN col_name column_type;
#如:
alter table super_table add column column_name int;
ALTER STABLE stb_name DROP COLUMN col_name;
#如:
alter table super_table drop column column_name;
ALTER STABLE stb_name ADD TAG tag_name tag_type;
#如:
alter table super_table add tag column nchar(60);
ALTER STABLE stb_name DROP TAG tag_name;
#如:
alter table super_table drop tag tag_name;
ALTER STABLE stb_name RENAME TAG old_tag_name new_tag_name;
#如:
alter table super_table change tag old_tag_name new_tag_name;
alter table item_table_name set tag column_key = “value”;
使用 SELECT 语句可以完成在超级表上的投影及聚合两类查询,在 WHERE 语句中可以对标签及列进行筛选及过滤。
如果在超级表查询语句中不加 ORDER BY,返回顺序是先返回一个子表的所有数据,然后再返回下个子表的所有数据,所以返回的数据是无序的。如果增加了 ORDER BY 语句,会严格按 ORDER BY 语句指定的顺序返回的。
创建表时timestamp 字段必须为第一个字段类型为主键
CREATE TABLE [IF NOT EXISTS] [db_name.]tb_name (create_definition [, create_definition] ...) [table_options]
CREATE TABLE IF NOT EXISTS a(c timestamp,b int)
#这样建表之后,子表会复制除去超级表里面的tags字段外的所有字段;
create table table_name using super_table tags (column_value,column_value ...);
drop table if exists 表名;
show tables;
#添加过滤条件
show tables like "%table_name%";
describe 表名;
alter table mytable add column addfield int;
alter table mytable drop column addfield;
https://github.com/arielyang/TDengineGUI
TDengineGUI是一个基于electron构建的,针对时序数据库TDengine的图形化管理工具。具有跨平台、易于使用、版本适应性强等特点。
安装windows版本,效果图如下:
新建连接:服务的端口号(默认为6041)、连接服务器的用户名和密码(默认为root:taosdata),如果修改过用户名或者密码,请按实际情况进行配置。
TDengine要求每个数据采集点单独建表,这样能极大提高数据的插入/查询性能,但是导致系统中表的数量猛增,让应用对表的维护以及聚合、统计操作难度加大。因此,为降低应用的开发难度,TDengine引入了超级表 STable (Super Table)的概念。
STable 是同一类型数据采集点的抽象,是同类型采集实例的集合。每个 STable 包含多张数据结构一样的子表,并为其子表定义了表结构和一组标签。
子表本质上就是普通的表,由一个时间戳主键和若干个数据列组成,每行记录着具体的数据,数据查询操作与普通表完全相同;但子表与普通表的区别在于每个子表从属于一张超级表,并带有一组由 STable 定义的标签值。
每种类型的采集设备可以定义一个 STable。数据模型定义表每列数据的类型,如温度、压力、电压、电流、GPS 实时位置等;而标签信息属于 Meta Data,如采集设备的序列号、型号、坐落位置等,它是静态的,是表的元数据。用户在创建表(数据采集点)时除可以指定 STable(采集类型)外,还可以指定标签的值。
举例解释一下(超级表)super_table,(子表)sub_table,(标签)Tag之间的关系。
在物联网中,假设我们现在有一个小区的电表设备需要联网。那么电表就会存在张三家的电表,李四家的电表,张三家电表的电流和电压,李四家的电流和电压,以及王五等等家的设备信息。
那么作为电表这个物联设备,就可以设计成超级表super_table,这样电表就有了张三的电表sub_table1,李四家的电表sub_table2,等等,电流和电压就是超级表中定义表字段属性,而电表所属的业主名称,小区地址可以存放在TAG。
按照这个场景,我们就可以设计出一张超级表(super_dianbiao),和若干张子表(dianbiao1001,dianbiao1002,等等)。
#创建数据库
create database mydb;
#使用数据库
use mydb;
# 创建超级表
create stable super_dianbiao (ts timestamp,dianya float,dianliu float) tags (yezhu_name nchar(15),xiaoqu_location nchar(50),menpai_num nchar(10));
create table dianbiao1001 using super_dianbiao tags('张三','东城小区','1-1101');
create table dianbiao1002 using super_dianbiao tags('李四','东城小区','1-1102');
insert into dianbiao1001 values(now,1.7,3.2);
insert into dianbiao1002 values(now,1.6,3.1);
TDengine的关键创新点——一个采集点一张表,同一类型的采集点用一个超级表来描述,也就是一个表结构Schema和静态标签Schema
。动态采集的物理量作为各字段,静态属性(Location和groupId)作为子表标签。利用超级表作为模板,生成子表 – 对应各采集点,有了超级表,极大地方便了同类采集点的数据检索、查询、聚合。
这种设计有几大优点:
如果采用传统的方式,将多个设备的数据写入一张表,由于网络延时不可控,不同设备的数据到达服务器的时序是无法保证的,写入操作是要有锁保护的,而且一个设备的数据是难以保证连续存储在一起的。采用一个数据采集点一张表的方式,能最大程度的保证单个数据采集点的插入和查询的性能是最优的。
本文旨在让各位能够基本了解TDengine的基本使用和核心概念,下文即将介绍TDengine与Springboot的工程实践,敬请期待!