当前位置: 首页 > 后端技术 > Node.js

时序数据库InfluxDB(六)

时间:2023-04-03 12:10:25 Node.js

相关文章:时序数据库InfluxDB(一)时序数据库InfluxDB(二)时序数据库InfluxDB(三)时序数据库InfluxDB(四)时序数据库InfluxDB(五)时序数据库InfluxDB(6)CQContinuousQueryContinuousQueries(CQ)是InfluxDB的一个非常重要的功能。它的作用是在InfluxDB数据库内部自动定时执行查询,然后将查询结果存储在指定的measurement中。配置文件中的相关配置:[continuous_queries]enabled=truelog-enabled=truequery-stats-enabled=falserun-interval="1s"enabled=true:启用CQlog-enabled=true:输出CQ日志query-stats-enabled=false:关闭CQ进行相关监控,不会将统计数据写入默认监控数据库_internalrun-interval="1s":InfluxDB每隔1s检查是否有CQ。基本语法1、基本语法:CREATECONTINUOUSQUERYONBEGINEND在某个数据库上创建一个CQ,查询cq_query语法的具体内容为:SELECTINTOFROM[WHERE]GROUPBYtime()[,]SELECTfunction[s]:连续查询不只是原始数据的简单查询,而是基于对原始数据进行聚合、特选、转换、预测等处理,因此CQ必须具备一种或多种数据处理功能。INTO:将CQ的结果存储到指定的测量中。FROM:原始数据来自的测量。[WHERE]:可选,原始数据的过滤条件。GROUPBYtime()[,]:连续查询不是一次,而是每次查询指定时间范围内的数据,周期性执行。定位测量的完整格式是:..使用当前数据库和默认RP时只需要测量。InfluxDB支持的持续时间单位:ns:纳秒u/μ:微秒ms:毫秒s:秒m:分钟h:小时d:天w:星期二,1,CQ什么时候执行?CQ何时执行取决于创建CQ的时间点,GROUPBYtime()设置的时间间隔,以及InfluxDB数据库预设的时间边界(这个预设时间边界实际上是1970.01.0100:00:00UTC时间,对应Unix时间戳的0值)。假设我在北京时间2019.11.05(即时间间隔为30天)创建了一个GROUPBYtime(30d)CQ,那么这个CQ会在什么时候执行呢?一、2019.11.05转换为时间戳为1572883200秒;然后计算1572883200和0之间的30天数(每天86400秒),1572883200/86400/30=606.8;那么接下来的30天就是606.8向上取整607,6078640030=1573344000,换算成对应的日期是2019.11.10,也就是CQ第一次执行的时间,之后每次执行都会往后推30天。每次都这样计算会很麻烦,但其实我们用的比较多的时间间隔并没有那么长,一般都是以秒、分、小时为单位。这种情况下,直接从0速度开始计算就可以了,例如:在16:09:35创建CQ的时间点,GROUPBYtime(30s),则CQ的执行时间为16:10:00,16:10:30,16:11:00等等(从0开始快速计算)。CQ创建时间为16:16:08,GROUPBYtime(5m),则CQ的执行时间为16:20:00、16:25:00、16:30:00等(从0m开始快速计算).CQ是在时间16:38:27创建的,GROUPBYtime(2h),则CQ的执行时间为18:00:00、20:00:00、22:00:00等(从0h开始快速计算).2、CQ执行的数据范围是多少?连续查询会根据GROUPBYtime()的时间间隔来确定要操作的数据,每次执行的数据时间范围为[now()-GROUPBYtime(),now())。例如GROUPBYtime(1h):在8:00执行时,当时间大于等于7:00且小于8时,数据为[7:00,8:00)范围内的数据:00。9:00执行时,当时间大于等于8:00且小于9:00时,数据为[8:00,9:00)范围内的数据。您可以使用WHERE过滤数据,但WHERE中指定的时间范围将被忽略。3、CQ的执行结果是什么?CQ会将执行结果存储在指定的measurement中,但是具体存储的字段是什么?首先,时间是必不可少的。Time写入CQ执行时数据范围的起始时间点;其次是函数的处理结果。如果只有一个字段,那么字段键就是函数的名称。如果有多个字段,那么字段键就是函数名_动作字段。例如,GROUPBYtime(30m),UTC7:30执行:单字段:SELECTmean("field")INTO"result_measurement"FROM"source_measurement"GROUPBYtime(30m)CQresult:timemean2019-11-05T07:00:00Z7Multi-field:SELECTmean("*")INTO"result_measurement"FROM"source_measurement"GROUPBYtime(30m)CQResult:timemean_field1mean_field22019-11-05T07:00:00Z76.5这里的均值对应于function中的均值函数。3、GROUPBYtime()的完整格式为:GROUPBYtime([,])第二个参数offset_intervaloffset是可选的,这个offset会对CQ的执行时间和Dataranges有影响.如果GROUPBYtime(1h)在8:00执行,则数据范围为[7:00,8:00)。那么GROUPBYtime(1h,15m)会将CQ的执行时间延迟15m,即8点15分执行,数据范围变为[7:15,8:15)。高级语法高级语法:CREATECONTINUOUSQUERYONRESAMPLEEVERYFORBEGINEND与基本语法不同,高级语法多了RESAMPLEEVERYFOR1、RESAMPLEEVERYEVERY定义了CQ执行的间隔:RESAMPLEEVERY30m表示每30m执行一次CQ。示例:CREATECONTINUOUSQUERY"cq_every"ON"db"RESAMPLEEVERY30mBEGINSELECTmean("field")INTO"result_measurement"FROM"source_measurement"GROUPBYtime(1h)END如果没有RESAMPLEEVERY30m,只有GROUPBYtime(1h)将:在8:00执行CQ,数据范围为[7:00,8:00]在9:00执行CQ,数据范围为[8:00,9:00)添加RESAMPLEEVERY30m后,每30m执行一次CQ:ExecuteCQat8:00,thedatarangeis[7:00,8:00]ExecuteCQat8:30,thedatarangeis[8:00,9:00)ExecuteCQat9:00,数据范围为[8:00,9:00),由于执行结果的时间字段为8:00,与上次CQ一致,所以会覆盖上次CQ的结果。当EVERY的时间间隔小于GROUPBYtime()时,会提高CQ的执行频率(如上例)。当EVERY与GROUPBYtime()的时间间隔一致时,没有作用。当EVERY的时间间隔大于GROUPBYtime()时,CQ的执行时间和数据范围完全由EVERY控制,例如EVERY30m,GROUPBYtime(10m):CQ在8:00执行,而thedatarangeis[7:30,8:00)ExecuteCQat8:30,thedatarangeis[8:00,8:30)2.RESAMPLEFORFOR定义数据的时间范围:RESAMPLEFOR1h表示每条CQ数据的时间范围为1h。例子:CREATECONTINUOUSQUERY"cq_for"ON"db"RESAMPLEFOR1hBEGINSELECTmean("field")INTO"result_measurement"FROM"source_measurement"GROUPBYtime(30m)END如果没有RESAMPLEFOR1h,只有GROUPBYtime(30m)Will:ExecuteCQat8:00,thedatarangeis[7:30,8:00]ExecuteCQat8:30,thedatarangeis[8:00,8:30)添加RESAMPLEFOR1h后,每次CQ的时间范围是1h,但是因为GROUPBYtime(30m),所以每次CQ都会按照30m写两点数据:CQ在8:00执行,数据的总范围是[7:00,8:00),实际上会拆分成[7:00,7:30)和[7:30,8:00)两个点在8:30执行CQ,数据总范围为[7:30,8:30),而实际上会拆分成两点[7:30,8:00)和[8:00,8:30)当FOR的时间间隔大于GROUPBY时间(),每个CQ的时间范围扩大了,但是每个点仍然是GROUPBYtime()的时间间隔,所以每个CQ写了多个点(如上例)。当FOR和GROUPBYtime()的时间间隔相同时,没有作用。当FOR的时间间隔小于GROUPBYtime()时,创建CQ会报错,这是不允许的。3.EVERY...FOREVERY和FOR可以一起使用。示例:在“db”上创建连续查询“cq_every_for”每隔1小时重采样一次90mBEGINSELECTmean(“field”)INTO“result_measurement”FROM“source_measurement”GROUPBYtime(30m)ENDEVERY1h大于GROUPBYtime(30m),所以CQ每1h执行一次;FOR90m,每次CQ执行的时间范围为90m,按照30m拆分为三个点:8:00执行CQ,总数据范围[6:30,8:00),实际将拆分为三个点[6:30,7:00),[7:00,7:30),[7:30,8:00)9:00执行CQ,数据总范围为[7:30,9:00),实际上会拆分成三个点[7:30,8:00),[8:00,8:30),[8:30,9:00)最后,CQ只能创建和删除,不能修改的。个人公众号持续输出原创文章,感兴趣的可以关注。

猜你喜欢