鼎鼎知识库
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798
  1. # 基本概念
  2. TDengine有三个模块。一个是客户端模块`taosc`。另外两个是服务端模块,一个是管理节点模块`MGMT`,一个是数据节点模块`DNODE`。客户端模块把请求交给管理节点模块,通过TCP/UDP的方式,在配置文件中通过`mgmtShellPort`来配置端口,默认端口是`6030`。客户端模块也会和数据节点模块打交道,也通过TCP/UDP的方式,默认端口是`6035`。
  3. 所有的元数据、存储和查询都会首先和管理节点模块打交道,会有缓存。元数据包括用户、数据库、表。
  4. 在数据节点模块中的一个最重要的概念是虚拟节点`vnode`.一个库可以有很多`vnode`。一个表只会在一个`vnode`里,不会跨`vnode`存在。在写数据的时候里面有一个`预写日志`机制,就是把数据先放在缓存里,如果遇到突然断电的情况也没关系,因为当电力恢复之后缓存的数据还会进入硬盘,专业术语叫做`落盘`。落盘有两种方式。一种是`时间驱动落盘`,就是每隔一段时间缓存数据就会进入硬盘,默认为1小时,在`taos.cfg`中的`commitTime`字段配置;另外一种是`数据驱动落盘`,当缓存数据达到一定规模数据会进入硬盘,并且刷新日志文件。关键几个配置如下:
  5. ```
  6. 数据保存位置:
  7. 默认放在了/var/lib/taos/目录中,通过dataDir设置。
  8. 数据分片:
  9. 默认vnode中表数据按10天切片,通过daysPerFile设置。
  10. 保存时间:
  11. 默认是3650天,系统自动删除,通过daysToKeep设置。
  12. 数据块:
  13. 按列存储。
  14. 数据文件种类:
  15. -data文件
  16. -head文件
  17. -last文件
  18. ```
  19. **最佳实践**
  20. - **一个设备一张表**:提升读取写入速度,在存储介质上是连续的,一张表只有一个写入者,没有锁,以追加的方式写数据
  21. - **采集的物理量**:也就是列,类型包括整型、浮点型、字符串型,没有索引。
  22. - **时间戳**:有索引
  23. - **标签**:保存在超级表的元数据节点中
  24. - **超级表**:方便聚合统计
  25. - **库**:涉及保留时长、备份数、Cache大小、文件块大小、是否压缩分库
  26. - **库和表的数量**:没有限制
  27. # SQL语句
  28. - <> 表示用户需要输入的内容
  29. - [] 表示用户输入的内容可选
  30. - | 表示多选一
  31. - ... 表示前面的项可重复多个
  32. # 时间戳
  33. - 时间格式:YYYY-MM-DD HH:mm:ss.MS, 2017-08-12 18:25:58.128
  34. - 时间分辨率:默认毫秒
  35. - 服务器内部函数:now表示服务器的当前时间
  36. - 时间戳为0:默认使用服务器当前时间
  37. - Epoche Time,长整数:表示从1970-01-01 08:00:00.000开始的毫秒数
  38. - 时间可以加减:比如`now-2h`,a表示毫秒,s表示秒,m表示分钟,h表示小时,d表示天,w表示周,n表示月,y表示年。比如`select * from t1 where ts > now-2w and ts <=now-1w`
  39. - 启用微秒:通过`enableMicrosecond`
  40. # 数据类型
  41. - TIMESTAMP:8 bytes, 时间戳,最小精度为毫秒,从格林威治时间1970-01-01 08:00:00.000开始
  42. - INT:4 bytes, 整型,范围是[-2^31+1,2^31-1],-2^31被用作null值
  43. - BIGINT: 8 bytes,长整型,范围是[-2^59,2^59]
  44. - FLOAT:4 bytes, 浮点型,有效位数6-7
  45. - DOUBLE:8 bytes, 双精度浮点型,有效位数15-16
  46. - BINARY: 长度自定义,记录字符串,最长不能超过504bytes,字符串两端使用单引号,否则英文全部自动转换为小写。使用时需指定大小,比如binary(20)是最长是20个字符的字符串,每个字符站1byte的存储空间,如果字符串超过20个字节,将自动截断。对于字符串内的单引号,用转义符`\'`。
  47. - SMALLINT,2 bytes, 短整型,范围[-32767.32767]
  48. - TINYINT, 1 bytes, 单字节整型,范围[-127,127]
  49. - BOOL, 1 bytes, 布尔类型,true或false
  50. - NCHAR,自定义大小,拥有记录非ASCII字符串,如中文字符,每个nchar占用4个字节大小。字符串两端使用单引号,字符串内的单引号需要转义`\'`,nchar(10)表示最多存储10个nchar字符,占用40bytes空间。如果字符串超出声明长度将被自动截断。
  51. # 数据库管理
  52. SQL语句中的英文字符默认不区分大小写,统一自动转换为小写执行。如果有大小写敏感,需要使用单引号把大写字母引用起来。
  53. - 创建数据库:`CREATE DATABASE MYDB`,默认数据库数据保存10年
  54. - 使用数据库:`USE MYDB`
  55. - 删除数据库:`DROP DATABASE MYDB`
  56. - 显示所有数据库:`SHOW DATABASES`
  57. # 表管理
  58. - 创建表:`CREATE TABLE tb_name (timestamp_field_name TIMESTAMP, field1_name data_type1)`表的第一个字段必须是`TIMESTAMP`类型,系统会自动将其设置为主键。表的每行的长度不能超过托4096个字节。使用数据类型binary或nchar需要制定最长的字节数,比如binary(20)
  59. - 删除表:`DROP TABLE tb_name`
  60. - 显示数据库下的所有表信息:`SHOW TABLES`,可以使用like过滤,比如`SHOW TABLES LIKE ...`,%匹配0到任意个字符,_表示匹配一个字符
  61. - 获取表结构:`DESCRIBE`
  62. - 表增加列:·`ALTER TABLE tb_name ADD COLUMN field_name data_type`
  63. - 表删除列:`ALTER TABLE tb_name DROP COLUMN filed_name`
  64. 注意:
  65. - 如果通过超级表创建,只能针对超级表进行操作,同时针对超级表的结构更改对所有表都会生效。
  66. - 使用`use db_name`操作后操作当前数据库下的表
  67. - 切换到其它数据库的表,可以使用`demo.tb1`来表示
  68. # 数据写入
  69. - 插入一条记录:`INSERT INTO tb_name VALUES (field_value, ...)`
  70. - 插入一条记录到指定的列:`INSERT INTO tb_name(field1_name,...) VALUES(field1_value)`,语句中没有出现的列,数据库将自动填充为NULL
  71. - 插入多条记录:`INSERT INTO tb_names VALUES (field1_value1, ...) (field1_value2,...)`
  72. - 按指定的列插入多条记录:`INSERT INTO tb_name(field1_name,...) VALUES(field1_value1,...)(field1_value2,...)`
  73. - 向多个表插入多条记录:`INSERT INTO tb1_name VALUES (field1_value1,...)(field1_value2,...)... tb2_name VALUES (field1_value1,...)(field1_value2,...)...`
  74. - 同时向多个表按列插入多条记录
  75. ```
  76. INSERT INTO tb1_name (tb1_field1_name,...) VALUES(field1_value1,...)(field1_value1,...)
  77. tb2_name (tb2_field1_name,...) VALUES(field1_value1,...)(field1_value2,...)
  78. ```
  79. 注意:
  80. - 对于同一张表,记录的时间戳必须是递增,否则会跳过插入该条记录;如果时间戳为0,会默认使用服务器当前时间作为时间戳
  81. - 如果需要将时间戳小于最后一条记录时间的记录写入到数据库,可以使用IMPORT命令替代INSERT命令,语法是一样的;如果同时IMPORT多条记录,需要保证一批记录是按时间戳排序好的
  82. # 数据查询
  83. ```
  84. SELECT {* | expr_list} FROM tb_name
  85. [WHERRE where_condition]
  86. [ORDER BY _c0 {DESC | ASC}]
  87. [LIMIT limit, [, OFFSET offset]]
  88. [>> export_file]
  89. SELECT function_list FROM tb_name
  90. [WHERE where_condition]
  91. [LIMIT limit [, OFFSET offset]]
  92. [>> export_file]
  93. ```
  94. - 返回所有列:*
  95. - 指定列
  96. - 对数字列进行四则运算
  97. - 给列取别名
  98. - where语句结合逻辑判断
  99. - where语句结合通配符
  100. - `_c0`表示首列的时间戳
  101. - 输出结果默认按时间戳升序排列
  102. - ORDER BY只能对时间戳操作,对其它字段操作属于非法
  103. 过滤操作:同时使用多个字段过滤需要使用`AND`,暂时不支持`OR`。针对同一字段的过滤条件必须单一,例如`Value>20 and value <30`是合法的,`Value<20 AND Value <> 5`是非法的。
  104. - `>` 适用于timestamp 和 numeric types
  105. - `<` 适用于timestamp 和 numeric types
  106. - `>= ` 适用于 timestamp 和 numeric types
  107. - `<=` 适用于 timestamp 和 numeric types
  108. - `=` 适用于所有类型
  109. - `<>` 适用于所有类型
  110. - `%` 适用于 binary 和 nchar
  111. - `_` 适用于 binary 和 nchar
  112. # SQL函数
  113. COUNT
  114. ```
  115. SELECT COUNT([*|field_name]) FROM tb_name [WHERE clause]
  116. 返回行数或某列的非空值数量
  117. 返回类型为INT64
  118. 应用于全部字段,表和超级表
  119. ```
  120. AVG
  121. ```
  122. SELECT AVG(field_name) FROM tb_name [WHERE clause]
  123. 返回统计表或超级表中某列的平均值,返回结果类型为double,不能应用在timestamp, binary, nchar, bool字段
  124. ```
  125. WAVG
  126. ```
  127. SELECT WAVG(field_name) FROM tb_name WHERE clause
  128. 加权平均,返回sdouble,不能用在timestamp, binary, nchar, bool类型,适用于表和超级表
  129. ```
  130. SUM
  131. ```
  132. SELECT SUM(field_name) FROM tb_name [WHERE clause]
  133. 统计表或超级表某列的和,返回double或int64,不能用在timestamp, binary, nchar, bool
  134. ```
  135. STDDEV
  136. ```
  137. SELECT STDDEV(field_name) FROM tb_name [WHERE clause]
  138. 统计某列的均方差,返回double,不能用在timestamp, binary, nchar, bool
  139. ```
  140. LEASTSQUARES
  141. ```
  142. SELECT LEASTSQUARES(field_name) FROM tb_name [WHERE clause]
  143. 返回表中某列值是主键(时间戳)的拟合直线方程,返回结果是字符串(斜率,截距),不能应用在timestamp, binary, nchar, bool,自变量是时间戳,因变量是该列的值,适用于表
  144. ```
  145. MIN
  146. ```
  147. SELECT MIN(field_name) FROM {tb_name | stb_name} [WHERE clause]
  148. 不能用在timestamp, binary, ncahr, bool
  149. ```
  150. MAX
  151. ```
  152. SELECT MAX(field_name) FROM {tb_name | stb_name} [WHERE clause]
  153. ```
  154. FIRST
  155. ```
  156. SELECT FIRST(field_name) FROM {tb_name | stb_name} [WHERE clause]
  157. 表或超级表中某列值最先写入的非NULL值,适用于所有字段,各个列FIRST(*),如果结果集中的某列全部为NULL,该列的返回结果也是NULL,如果结果集中所有列全部为NULL值则不返回结果
  158. ```
  159. LAST
  160. ```
  161. SELECT LAST(field_name) FROM {tb_name | stb_name} [WHERE clause]
  162. 表或超级表中某列的值最后写入的非NULL值,所有字段,如果返回各个列LAST(*),如果结果集中某列全部为NULL值则该列返回的结果也是NULL,如果结果集中所有列全部为NULL则不返回结果。
  163. ```
  164. TOP
  165. ```
  166. SELECT TOP(field_name, K) FROM {tb_name | stb_name} [WHERE clause]
  167. 统计表或超级表中某列的值最大k个非null值,不能用在timestamp, binary, ncahr, bool,k的取值范围在[1,100]
  168. ```
  169. BOTTOM
  170. ```
  171. SELECT BOTTOM(field_name, K) FROM {tb_name | stb_name} [WHERE clause]
  172. ```
  173. PERCENTILE
  174. ```
  175. SELECT PERCENTILE(field_name, P) FROM {tb_name | stb_name} [WHERE clause]
  176. 表中某列值的百分比分位数,返回double, 不能用在timestamp, binary, ncahr, bool,k的范围0和100之间,0时候等同于MIN,100的时候等同于MAX
  177. ```
  178. LAST_ROW
  179. ```
  180. SELECT LAST_ROW(field_name) FROM {tb_name | stb_name}
  181. 返回表或超级表的最后一条记录,与last函数不同,last_row不支持时间范围限制,强制返回最后一条记录
  182. ```
  183. DIFF
  184. ```
  185. SELECT DIFF(field_name) FROM tb_name [WHERE clause]
  186. 统计表中某列的值与前一行对应值的差,不能应用在timestamp, binary, nchar, bool类型
  187. ```
  188. SPREAD
  189. ```
  190. SELECT SPREAD(field_namne) FROM {tb_name | stb_name}[WHERE clause]
  191. 统计超级表或表中某列的最大值和最小值之差,返回double,不能用在binary, nchar, bool类型,可用于TIEMSTAMP字段表示记录的时间覆盖范围
  192. ```
  193. 四则运算
  194. ```
  195. SELECT field_name [+|-|*|/|%][value | field_name] from {tb_name | stb_name} [WHERE clause]
  196. 统计表或超级表中某列或多列的计算,不能用在timestamp, binary, nchar, bool类型,支持两列或多列之间计算,使用括号表示优先级,Null字段不参与计算,如果参与计算的某行中保包含null,改行的结果是Null
  197. ```
  198. # 举例
  199. ```
  200. CREATE TABLE tb1(ts timestamp, col1 int, col2 float, col3 binary(50))
  201. SELECT * FROM tb1 WHERE ts >= NOW - 1h
  202. SELECT * FROM tb1 WHERE ts > '2018-06-01 08:00:00.000' AND ts <= '2018-06-02 08:00:00.000' AND col3 LIKE `%nny` ORDER BY ts DESC
  203. SELECT (col1 + col2) AS `complex` FROM tb1 WHERE ts > '2018-06-01 08:00:00.000' AND col2 > 1.2 LIMIT 10 OFFSET 5
  204. SELECT COUNT(*) FROM tb1 WHERE ts >= NOW - 10m AND col2 > 3.14 >> /home/testoutpu.csv
  205. ```
  206. # 时间维度聚合
  207. 按照时间切割再聚合,比如温度传感器每秒采集一次数据,徐查询每隔10分钟温度的平均值。
  208. ```
  209. SELECT function_list FROM tb_name
  210. [WHERE where_condition]
  211. INTERVAL(interval)
  212. [FILL ({None | VALUE | PREV | NULL | LINEAR})]
  213. SELECT function_list FROM stb_name
  214. [WHERE where_condition]
  215. [GTOUP BY tags]
  216. [FILL ({VALUE | PREV | NULL | LINEAR})]
  217. ```
  218. - 聚合时间段由INTERVAL指定,最短时间10毫秒,10a
  219. - 仅限于单个输出的函数:count, avg, sum, stddev, leastsquares, percentile, min, max, first, last不能用于多行输出函数比如top, bottom, diff和四则运算
  220. - WHERE语句指定查询的起止时间和过滤条件
  221. - FILL语句指定某一时间数据确实情况下的填充模式。NONE,也是默认的方式,不填充;VALUE,固定值填充;NULL,使用NULL值填充;PREV,使用上一个非NULL值填充数据
  222. - 使用FILL时候,务必指定查询的时间区间,针对每次查询系统可返回不超过1千万条结果
  223. - 在实践维度聚合中,返回的结果中时间序列严格单调递增
  224. - 如果查询对象是超级表,则聚合函数会作用于该超级表下满足值过滤条件的所有表。如果查询中没有group by语句,则返回的结果按照该时间序列严格单调递增。如果查询中使用了group by语句分组,则返回结果中每个group内部按照时间序列严格单调递增。
  225. ```
  226. create table sensor(ts timestamp, degree double, pm25 smallint)
  227. SLECT AVG(degree), MAX(degree), LEASTSQUARES(degree), PERCENTILE(degree, 50) FROM sensor
  228. WHERE TS>=now -1d //过去20小时
  229. INTERVAL(10M) //以10分钟为一个阶段
  230. FILL(PREV);
  231. ```
  232. # 超级表STable
  233. 对单个采集点单独建表导致表数量增加,如何对这些表进行聚合、统计呢?引入STable。
  234. > 什么是超级表STable
  235. - 同类型数据采集点的抽象
  236. - 包含多长数据结构一样的字表
  237. - STable为其子表定义了表结构和一组标签。表结构就是表中记录的数据列及其数据类型。标签名也由STable定义,标签值记录每个子表的静态信息,用于对子表进行分组过滤。
  238. - 子表本质上就是普通的表,由一个时间戳和若干数据列组成
  239. - 子表与普通表的区别在于每个子表从属于一张超级表,并带有一组STable定义的标签值
  240. - 每种类型的采集设备可以定义一个STable。比如定义表的每列的数据类型,比如温度、电压、电流。标签信息属于Meta Data,如采集设别额序列号、型号、位置等是静态的。用户在创建表时指定Stable,还可以指定标签的值,也可以事后增加或修改。
  241. ```
  242. create table thermometer (ts timestamp, degree float) tags (location binary(20), type int)
  243. create table t1 using thermometer tags ('beijing', 10)
  244. ```
  245. - 可以使用STable创建数量无上限的、具有不同标签的表
  246. - STable就是具有相同数据模型,不同标签的表的集合
  247. - 将标签数据和采集的动态数据完全分离,对标签建立了高性能内存索引结构
  248. - 一个库可以有多个STable, 一个STable有多个子表
  249. > 超级表管理
  250. - 创建超级表:`CREATE TABLE <stable_name> (<field_name> TIMESTAMP, field_name1 field_type,...) TAGS (tag_name tag_type)`,TAGS的总长度不能超过512字节,数据类型不能是timestamp和nchar,不能与其它列名相同,不能为预留关键字
  251. - 显示已创建的超级表:`show stables;`
  252. - 删除超级表:`DROP TABLE <stable_name>`,删除超级表的前提要求先删除所有的子表
  253. - 查看属于某个超级表并满足条件的子表:`SELECT TBNAME,[TAG_NAME,…] FROM <stable_name> WHERE <tag_name> <[=|=<|>=|<>] values..> ([AND|OR] …)`
  254. - 查看属于某个超级表并满足查询条件的表,TBNAME为关键字:`SELECT COUNT(TBNAME) FROM <stable_name> WHERE <tag_name> <[=|=<|>=|<>] values..> ([AND|OR] …)`
  255. > 写数据时自动创建子表
  256. 当定义好了超级表,在写数据的时候并不知道某个设备是否存在,可以采用自动创建子表,需要注意的是超级表是不能自动创建的。
  257. ```
  258. INSERT INTO <tb_name> USING <stb_name> TAGS (<tag1_value>,...) VALUES (field_value,...)(field_value,...)...
  259. ```
  260. 对多个超级表下的子表创建。
  261. ```
  262. INSERT INTO <tb1_name> USING <stb1_name> TAGS (<tag1_value1>, ...) VALUES (<field1_value1>,...)(<field1_value2>,...)...<tb_name2> USING <stb_name2> TAGS(<tag1_value2>,...) VALUES (<field1_value1>,...)
  263. ```
  264. > TAG管理
  265. - 添加新的标签:`ALTER TABLE <stable_name> ADD TAG <new_tag_name> <TYPE>`,标签总数不能超过6个
  266. - 删除标签:`ALTER TABLE <stable_name> DROP TAG <tag_name>`,第一列标签不能删除,至少保留一个标签,从超级表删除某个标签后,其下的所有子表也会自动删除标签
  267. - 修改标签名:`ALTER TABLE <stable_name> CHANGE TAG <old_tag_name> <new_tag_name>`,其下所有子表的标签名也会改变
  268. - 修改子表的标签值:`ALTER TABLE <table_name> SET TAG <tag_name>=<new_tag_value>`
  269. > 多表聚合
  270. 通过TAG值进行条件过滤,暂不支持针对binary类型的模糊匹配过滤。
  271. ```
  272. SELECT function<field_name>,…
  273. FROM <stable_name>
  274. WHERE <tag_name> <[=|<=|>=|<>] values..> ([AND|OR] …)
  275. INTERVAL (<time range>)
  276. GROUP BY <tag_name>, <tag_name>…
  277. ORDER BY <tag_name> <asc|desc>
  278. SLIMIT <group_limit>
  279. SOFFSET <group_offset>
  280. LIMIT <record_limit>
  281. OFFSET <record_offset>
  282. ```
  283. - 支持的函数:sum, count, avg, first, last, min, max, top, bottom
  284. - 针对全部或部分列的投影操作
  285. - 暂不支持其它类型的聚合计算和四则运算
  286. - 不支持嵌套
  287. - 不使用GROUP BY会对满足筛选条件的子表按时间聚合,按照时间戳单调递增输出
  288. - 使用`ORDER BY _c0 ASC | DESC`对时间戳升序或降序
  289. - 使用GROUP BY,按tags进行分组,组间的排序由ORDER BY指定,每个组内,按时间单调递增
  290. - 使用SLIMIT/SOFFSET指定组间分页。使用LIMIT/OFFSET指定组内分页。
  291. > 举例
  292. ```
  293. 创建超级表:
  294. CREATE TABLE thermometer (ts timestamp, degree double) TAGS(location binary(20), type int)
  295. 每个采集点一张表:
  296. CREATE TABLE term1 USING thermometer TAGS('beijing',1);
  297. CREATE TABLE therm2 USING thermometer TAGS('beijing',2);
  298. CREATE TABLE therm3 USING thermometer TAGS('tianjin',1);
  299. CREATE TABLE therm4 USING thermometer TAGS('shanghai',3);
  300. 写入数据
  301. INSERT INTO therm1 VALUES ('2018-01-01 00:00:00.000',20);
  302. INSERT INTO therm2 VALUES ('2018-01-01 00:00:00.000',21);
  303. INSERT INTO therm3 VALUES ('2018-01-01 00:00:00.000',22);
  304. INSERT INTO therm4 VALUES ('2018-01-01 00:00:00.000',23);
  305. 按标签聚合查询
  306. SELECT COUNT(*),AVG(degree), MAX(degree), MIN(degree)
  307. FROM thermoter
  308. WHERE location='beijing' or location='tianjing'
  309. GROUP BY location, type
  310. 按时间周期聚合查询
  311. SELECT COUNT(*),AVG(degree), MAX(degree), MIN(degree)
  312. FROM thermometer
  313. WHERE name<>'beijing' and ts>now-1d
  314. INTEERVAL(10M)
  315. GROUPBY location,type
  316. ```
  317. # 高级功能
  318. > 连续查询Continuoous Query
  319. - 定期自动执行
  320. - 滑动窗口的方式进行计算
  321. - 简化的、时间驱动的流式计算
  322. - 针对库中的表或超级表
  323. - 可以让TDengine推送查询结果,或者将结果写回到TDengine中
  324. - 每次执行的查询是一个时间窗口time window,时间窗口随着时间流动向前滑动
  325. - 定义时间窗口的大小interval,每次前向增量时间forward sliding times
  326. - 使用TAOS SQL定义
  327. - 采用时间驱动的模式
  328. - 原始采集数据进行采样down sampling
  329. - 不同于其它流式计算实时反馈结果,连续查询只在时间窗口关闭以后才计算反馈结果。比如时间窗口周期是1天,那么反馈结果是在23:59:59秒以后才生成反馈结果
  330. - 反馈的结果有一个时间区间,如果此时有历史记录再写入到这个时间区间,连续查询不会重新执行,不会重新将结果推送给用户,不会更新已存在的计算结果
  331. - 服务端并不缓存客户端的计算状态,如果应用端崩溃,再次拉起的连续查询将只会从最接近的时间窗口开始计算;如果使用写回模式,TDengine可以确保写回的有效性和连续性。
  332. - 是在应用端启动连续查询的
  333. ```
  334. SELECT COUNT(*)
  335. FROM FOO_TABLE
  336. INTERVAL(1M) SLIDING(30S)
  337. 每一分钟统计一次,前向滑动的时间是30秒。
  338. SELECT COUNT(*)
  339. FROM FOO_TABLE
  340. INTERVAL(1M)
  341. 每一分钟统计一次,前向滑动的时间是一分钟
  342. 注意:
  343. 前向滑动时间不能大于时间窗口的范围,如果大于了,系统将强制设置为时间窗口的范围。
  344. ```
  345. 将连续查询的结果写回到数据库中:
  346. ```
  347. CREATE TABLE QUERY_RES
  348. AS
  349. SELECT COUNT(*)
  350. FROM FOO_TABLE
  351. INTERVAL(1M) SLIDING(30S)
  352. ```
  353. 默认如果不输入结束时间,连续查询会一直进行下去。还可以指定结束时间:
  354. ```
  355. CREATE TABLE QUERY_RES
  356. AS
  357. SELECT COUNT(*)
  358. FROM FOO_TABLE
  359. WHERE TS > NOW AND TS <= NOW + 1H
  360. INTERVAL(1M) SLIDING(30S)
  361. ```
  362. 查看系统中全部运行的连续查询
  363. ```
  364. show streams
  365. ```
  366. 杀掉对应的连续查询
  367. ```
  368. kill stream
  369. ```
  370. **在写回模式中,如果把写回的表删除,连续查询也会自动停止**。
  371. > 数据订阅Publisher/Subscriber
  372. - 每一张表可视作一个标准的消息队列
  373. - 支持轻量级的消息订阅与推送服务
  374. - 使用系统提供的API,用户可以订阅数据库中的某一张表或超级表
  375. - 订阅的逻辑和操作状态的维护均由客户端完成
  376. - 客户端定时轮询服务器是否有新的记录到达,有新的记录到达就会将结果反馈到客户
  377. 启动订阅服务:
  378. ```
  379. TAOS_SUB *taos_subscribe(char *host, char *user, char *pass, char *db, char *table, int64_t time, int mseconds)
  380. --host: 主机ip地址
  381. --user: 数据库登录用户名
  382. --pass: 密码
  383. --db: 数据库名称
  384. --table: 超级表或表的名称
  385. --time: 启动时间,Unix Epoch,单位为毫秒,从1970年1月1日起计算的毫秒数,如果设置为0表示从当前时间开始订阅
  386. --mseconds: 查询数据库更新的时间间隔,单位为毫秒,一般设置为1000毫秒。返回值为指向TDengine_SUB结构的指针,如果返回为空,表示失败
  387. ```
  388. 获取订阅结果。用户应用程序置于一个无限循环语句,如果数据库表有新纪录到达,该API将放回最新的记录,如果没有新的记录该API将阻塞,如果返回值为空说明系统出错。
  389. ```
  390. TASOS_ROW taos_consume(TAOS_SUB *tsub)
  391. --tsub: taos_subscribe的结构体指针
  392. ```
  393. 取消订阅。应用程序退出时,务必调用此函数以避免资源泄露。
  394. ```
  395. void taos_unsubscribe(TAOS_SUB *tsub)
  396. ```
  397. 获取返回的一行记录中数据包含多少列。
  398. ```
  399. int taos_num_subfields(TAOS_SUB *tsub)
  400. ```
  401. 获取每列数据的属性(数据类型、名字、长度)。
  402. ```
  403. TAOS_FIELD *taos_fetch_subfields(TASO_SUB *tsub)
  404. ```
  405. > 缓存Cache
  406. - 时间驱动缓存策略First-In-First-Out, FIFO
  407. - 写驱动的缓存管理机制,和读驱动的缓存模式Least-Recent-Use, LRU不一样
  408. - 最近写入的数据保存在缓存中,当缓存达到临界值时,将最早的数据批量写入磁盘
  409. - 获取数据实际就是从缓存中获取,并且是毫秒级的
  410. - 可以将TDengine当作缓存来使用
  411. - TDengine重启以后系统的缓存将被清空,之前的缓存数据均会被写入磁盘,缓存数据将不会像专门的key-value缓存系统那样再将之前的缓存数据重新加载到缓存中
  412. - TDengjine会分配固定大小的内存空间作为缓存空间
  413. - 每个vnode都有其独立的缓存池,不同的vnode不共享缓存池
  414. - 每个vnode里面的表共享该vnode的缓存池
  415. - 缓存的大小由缓存块的大小和数量相关,cacheBlockSize定义每个缓存块的大小,cacheNumOfBlocks定义每个vnode中可以缓存块的数量,TDengine要求每张表至少有2个缓存块可供使用,因此cacheNmOfBlocks的数值不应该小于vnode结点中所包含表数量的两倍
  416. 获取一张表或超级表的最后一条记录
  417. ```
  418. select last_row(degree) from thermometer where location='beijing'
  419. ```
  420. # RESTful Connection
  421. 通过HTTP方式进行。
  422. ```
  423. http://<ip>:<PORT>/rest/sql
  424. http://192.168.0.1:6020/rest/sql
  425. -- IP: 集群中的任一台主机
  426. -- PORT:配置文件中的httpPort,默认值是6020
  427. -- Header里带身份认证信息,单机版仅支持Basic认证机制
  428. -- BODY里是一个完整的SQL语句,SQL语句中的数据表应该提供数据库前缀,否则系统会返回错误
  429. ```
  430. 请求:
  431. ```
  432. curl -H 'Authorization:Basic <TOKEN>' -d '<SQL>' <ip>:<PORT>/rest/sql
  433. curl -u username:password -d '<SQL>' <ip>:<PORT>/
  434. TOKEN为{username}:{password}经过Base64编码之后的字符串
  435. ```
  436. 返回格式:
  437. ```
  438. {
  439. "status": "succ",
  440. "head": ["column1","column2", …],
  441. "data": [
  442. ["2017-12-12 23:44:25.730", 1],
  443. ["2017-12-12 22:44:25.728", 4]
  444. ],
  445. "rows": 2
  446. }
  447. ```
  448. # 系统管理
  449. > 练手
  450. 根用户
  451. ```
  452. -- 进入根用户: sudo su
  453. -- 退出根用户: exit
  454. ```
  455. 根目录
  456. ```
  457. --来到根目录: cd /
  458. --退出控制台:exit
  459. ```
  460. vi练习
  461. ```
  462. --列出目录:ls
  463. --进入test目录: cd test
  464. --vi打开文件:vi hello.txt
  465. --决定光标的位置:
  466. 方向:h,j,k,l
  467. 行首:b
  468. 行尾:w
  469. 下面一行:o
  470. 上面一行:O
  471. 段首:{
  472. 段尾:}
  473. --决定插入的位置:
  474. 选择光标前后插入:i,a
  475. 选择光标所在行行首行尾插入:i,A
  476. --退出编辑:esc
  477. --保存并退出::wq!
  478. --不保存并退出::q!
  479. ```
  480. > 文件目录结构
  481. /etc/taos/taos.cfg 配置文件
  482. ```
  483. -- cd /
  484. -- cd etc/taos
  485. ```
  486. /usr/local/taos/driver 动态链接库目录
  487. ```
  488. -- cd /
  489. -- cd usr/local/taos/driver
  490. ```
  491. /var/lib/taos 数据文件默认目录
  492. ```
  493. --cd /
  494. --cd var/lib/taos
  495. ```
  496. /var/log/taos 日志文件目录
  497. ```
  498. --cd /
  499. --cd var/log/taos
  500. ```
  501. /usr/local/taos/bin 可执行文件目录
  502. ```
  503. --cd /
  504. --cd usr/local/taos/bin
  505. taos:shell可执行文件
  506. taosd:服务端可执行文件
  507. taosdump:数据导出工具
  508. rmtaos:卸载
  509. ```
  510. > 服务端配置
  511. 在/etc/taos/taos.cfg配置,配置完成后需要重启taosd服务才能生效。
  512. 指定配置文件的目录:
  513. ```
  514. taosd -c /home/user
  515. ```
  516. 查看taos.cfg文件:
  517. ```
  518. -- cd /
  519. -- cd etc/taos
  520. -- ls
  521. -- cat taos.cfg
  522. ```
  523. 配置详解:
  524. - internalIp:对外提供服务的ip地址
  525. - mgmtShellPort:管理结点与客户端通信使用的TCP/UDP端口号,默认6030,6030-6034端口被UDP占用,6030端口被TCP占用
  526. - vnodeShellPort:数据节点与客户端通信使用的TCP/UDP端口号,默认6035,6035-6039端口被UDP占用,6035端口被UDP占用
  527. - httpPort:数据结点对外提供RESTful服务使用的TCP端口号,默认6020
  528. - dataDir:数据库文件目录,默认/var/lib/taos
  529. - maxUsers:用户最大数量
  530. - maxDbs:数据库最大数量
  531. - maxTables:数据表最大数量
  532. - enableMonitor:系统检测,0关闭,1打开
  533. - logDir:日志文件目录,默认/var/log/taos
  534. - numOfLogLines:日志文件的最大行数
  535. - debugFlag: 131仅错误和报警信息,135:所有
  536. - days:一个数据文件覆盖的时间长度,单位是天
  537. - keep:数据库中保留数据的天数
  538. - rows:文件块中的记录条数
  539. - comp:文件压缩标志,0关闭,1一阶段压缩,2阶段压缩
  540. - ctime:数据从写入内存到写入硬盘的最长时间间隔,单位秒
  541. - clog:数据提交日志标志,0关闭,1打开
  542. - tables:每个vnode允许创建表的最大数目
  543. - cache:内存块的字节数大小
  544. - tblocks:每张表最大的内存块数
  545. - ablocks:每张表平均的内存块数
  546. - precision:时间戳,ms表示毫秒,us表示微秒
  547. 创建数据库:
  548. - 将具有相同特征的表放在一个库里
  549. - 一个应用有多个库
  550. - 为每个库配置不同存储参数
  551. - 客户端通过sql创建的数据库配置参数会覆盖系统配置参数
  552. ```
  553. create database demo days 10 cache 16000 ablocks 4
  554. ```
  555. > 客户端配置
  556. 在/etc/taos/taos.cfg配置,与taosd应用程序共享配置文件。启动taos时,也可以从命令行指定IP地址、端口号、用户名和密码,否则从taos.cfg读取。
  557. 为客户端程序taos指定配置文件目录:
  558. ```
  559. taos -c /home/cfg
  560. ```
  561. 参数详解:
  562. - masterIP:客户端默认发起请求的服务器IP地址
  563. - charset:指明客户端所使用的字符集,默认UTF-8,TDengine存储nchar类型数据时使用unicode存储,因此客户端需要告知服务自己所使用的字符集,即客户端所在系统的字符集
  564. - locale:设置系统语言环境,linux上客户端与服务端共享
  565. - defautlUser:默认登录用户,默认值root
  566. - defaultPass:默认登录密码,默认值taosdata
  567. > 用户管理
  568. - 创建用户:`CREATE USER user_name PASS 'password'`
  569. - 删除用户:`DROP USER user_name`,root用户使用
  570. - 修改用户密码:`ALTER USER user_name PASS 'password'`
  571. - 显示所有用户:`SHOW USERS`
  572. > 数据导入
  573. - 通过脚本文件导入:在文件中写好sql语句,每行一条,#表示注释
  574. - 从csv文件导入,每个csv文件属于一张表且格式和需要导入表的结构相同
  575. ```
  576. insert into tb1 file a.csv b.csv tb2 c.csv ...
  577. import into tb1 file a.csv b.csv tb2 c.csv ...
  578. ```
  579. > 数据导出
  580. - 按表导出csv文件,如果用户需要到处一个表或者一个STable表中的数据,可在shell中运行
  581. ```
  582. select * from <tb_name> >> a.csv
  583. ```
  584. - 用taosdump导出数据,通过`taosdump --help`获取更详细的用法说明
  585. ```
  586. --导出数据库中一张或多张表:taosdump [OPTION...] dbname tbname ...
  587. --导出一个或多个数据库:taosdump [OPTION...] --database dbname...
  588. --导出所有数据库(不含监控数据库): taosdump [OPTION...] --all-databases
  589. ```
  590. > 系统连接、任务查询关系
  591. 正在进行的查询、流式计算,查看连接:
  592. ```
  593. SHOW CONNECTIONS
  594. ```
  595. 强制关闭数据库连接:
  596. ```
  597. KILL CONNECTION <connection-id>
  598. ```
  599. 显示数据查询:
  600. ```
  601. SHOW QUERIES
  602. ```
  603. 强制关闭数据查询:
  604. ```
  605. KILL QUERY <query-id>
  606. ```
  607. 显示流式计算:
  608. ```
  609. KILL STREAM <stream-id>
  610. ```
  611. > 系统监控
  612. - TDengine启动后会自动创建一个监测数据库SYS,并自动将服务器的CPU,内存,硬盘空间,带宽,请求数,磁盘读写速度,慢查询等信息定时写入该数据库
  613. - TDengine还将重要的系统操作,比如登录、创建、删除数据库等日志及各种错误报警信息记录下来存放在SYS库里
  614. - 通过CLI或者WEB图形界面查看监测信息
  615. - 监测信息的采集默认是打开的,单可以通过修改配置文件中的enableMonitor来修改
  616. # 连接数据库实战
  617. - 数据库ip: 192.168.8.129