本文汇总了Lindorm时序引擎在数据写入、删除、查询时的常见问题,方便您更加熟悉时序引擎的使用方法,规避因为不当操作可能导致的性能问题,提高使用效率。
问题导览
数据写入
数据查询
数据删除
功能及性能
时序表设计
数据写入
推荐的最优数据写入方式是什么?
Java:推荐您通过Java Native SDK写入,该方式可以自动攒批写入和重试。详细说明,请参见通过Java Native SDK写入数据。
非Java:推荐使用行协议(Line Protocol)写入。详细说明,请参见行协议写入。
时序引擎支持的时间精度是什么?
时序引擎支持毫秒(ms)级别的时间存储,更高精度的数据会被转换为毫秒精度进行存储。因此,如果写入比毫秒精度更高的时间数据,会导致原数据的精度丢失。
使用行协议写入数据时需要注意什么?
使用行协议写入时您需要注意以下三点:
Tag Key、Tag Value中的字符串不需要添加半角单引号('')或半角双引号(""),两者均默认为STRING类型。如果添加了半角单引号('')或半角双引号(""),则引号会被判定为字符串的一部分。
Field Key(Field名)固定为字符串类型,不需要添加半角单引号('')或半角双引号("")。
Field Value(Field值)需注意数据类型:如果是字符串类型,则必须添加半角双引号(""),否则系统会报错;如果是INT类型,则必须在数值后添加后缀
i
,例如12i
、101i
,否则INT类型会被识别为FLOAT类型。
数据写入成功但无法查询到是什么原因?
请检查是否设置了数据有效期TTL。如果写入数据的时间超过TTL,则该数据写入后会被清理,导致查询结果为空。
想将Tag列的值设置为NULL
,写入时需要显式写入NULL
吗?
不需要,在写入数据时忽略该Tag即可。假设表sensor
共有5列:device_id、region、time、temperature和humidity,想让region列值为NULL,写入时忽略region写入即可,例如:INSERT INTO sensor(device_id, time, temperature, humidity) VALUES ('id123', current_timestamp, 37, 70);
。
数据查询
查询方式最推荐使用哪种?
推荐您通过JDBC Driver连接时序引擎,并使用prepareStatement绑参方式进行查询。使用prepareStatement绑参方式可以减少服务端资源占用,提高查询性能。使用方式说明,请参见教程:通过JDBC Driver连接并访问Lindorm时序引擎。
使用ORDER BY LIMIT
可能会有什么性能问题,有更好的查询方式吗?
使用ORDER BY LIMIT
查询时,数据库需要在内存中对数据进行排序。如果命中的数据量过大,可能会导致服务端占用大量内存进而引发稳定性问题。因此,为获得更高的查询效率,建议您减小查询的时间范围或增加更多的Tag条件,尽量减少查询命中的数据量。
此外,时序数据默认按照时间线返回时间递增的数据,无需添加order by time ASC
就可以得到以时间线为基准、按时间递增排序的数据。如果需要查询每条时间线的最后几条数据,可以使用最新值函数LATEST来代替ORDER BY time DESC
。具体语法说明,请参见最新值查询。
是否支持在WHERE条件里对同一个Field使用多个过滤条件?
暂不支持对同一个Field列、不同的Field列使用多个过滤条件。
Field列过滤是读取数据后再进行过滤的操作,效率较低且不支持同时对多个Field进行过滤,因此建议您使用Tag列进行过滤。
使用COUNT
查询如何获得更高的效率?
指定一个数值类型的Field列进行COUNT
计算的效率最高。
使用Native SDK查询时偶发报错,内容包含关键词Metaspace
,应该怎么解决?
使用Native SDK查询时需要编译SQL语句,占用了过多的元空间(Metaspace),推荐您通过JDBC Driver连接时序引擎,并使用prepareStatement绑定参数的方式进行查询。使用方式说明,请参见教程:通过JDBC Driver连接并访问Lindorm时序引擎。
创建的连续查询CQ未生效是什么原因?
使用CREATE CONTINUOUS QUERY
语句创建的连续查询未生效的可能原因如下:
INSERT INTO
指定的表还未创建。INSERT INTO
指定的表已创建,但该表的Schema与CREATE CONTINUOUS QUERY
语句指定的Schema不一致。
如果您的时序引擎为3.4.41及以上版本,建议您结合控制台查询日志进行排查。
查询耗时很长是什么原因?
请检查查询条件,如果未添加Tag过滤条件或者时间范围将会扫描全表,导致查询耗时很长。
数据删除
是否支持删除一段时间范围的数据?
暂不支持删除指定时间范围内的数据。当前仅支持根据指定Tag条件进行删除,不支持根据Field和时间条件删除。
大量的删除操作会有什么风险?
时序引擎在执行删除操作时并不是直接删除数据,而是为需要删除的数据添加删除标记,确保这些数据不再被查询到,直到这些数据超过有效期TTL被彻底清理。因此,如果提交了大量的删除请求,则会产生大量的删除标记,导致查询以及后台数据的合并性能变差,更严重时可能会导致服务不可用。
建议您尽量避免提交大量的删除请求,如果有数据空间清理的需求,可以通过设置TTL来实现。
是否支持删除特定字段?
暂不支持字段级别的删除操作。如果某个字段不再使用,只要不再查询该字段便不会影响性能。
功能及性能
云盘扩容是否会重启服务?
云盘扩容不会导致进程重启,不会影响您的服务。
冷热分界线设置后多久可以生效?
冷数据归档过程是在后台数据合并时进行的,当数据符合归档要求时将整体被归档至冷存储中。但为了避免冷数据频繁参与合并,时序引擎默认要求数据写入7天后才会被归档至冷存储,因此,如果写入的数据已经符合归档要求,通常还需要等待7天该数据才会被归档至冷存储,即7天后冷存策略(冷热分界线)才会生效。
数据归档至冷存储后还能再转移回热存储吗?
暂不支持将转移至冷存储的数据转移回热存储。因此建议您合理设置冷存储时间,经常查询的数据不要归档至冷存储。
是否支持查看表级别的磁盘占用情况?
暂不支持查看表级别的存储空间占用情况。目前仅支持查看数据库级别的磁盘占用情况,如需查看请联系Lindorm技术支持(钉钉号:s0s3eg3)。
时序引擎的压缩率不太理想是什么原因?
时序引擎对INT类型的数据压缩率更高,如果压缩率不够理想,可以检查测试数据是否为INT类型。
数据写入时会同时写入至内存和日志,日志数据会占用一定的存储空间,进而导致整体压缩率不够理想。
为获得较高的压缩率,新写入的数据不会立刻被压缩,需要等待在后台与已有数据合并后才会被压缩,该过程通常需要10小时以上。
时序表设计
时序表设计时需注意什么?
需注意Tag的设计,避免Tag的取值范围不可控。应尽量避免使用时间、进程号等易变数据作为表的Tag,此类数据会导致时间线数量及时间线索引膨胀,不利于查询和存储。