我正在使用Influx v1.3。我有一个测量,在1个月的时间内有大约2 +百万条记录,其中有10个标签。其中,我对user_id
和article_id
感兴趣。
我尝试使用非空user_id
提取针对特定article_id
记录的事件数。
选择所有用户的事件的查询非常快:
select count(*) from pageviews where user_id = '92363';
对用户和文章的特定事件的查询非常快:
select * from pageviews where user_id = '92363' and article_id = '879729';
但是当我尝试为非空(或空)article_id
添加过滤器时,查询会运行几十秒。
select count(*) from pageviews where user_id = '92363' and article_id != '';
select count(*) from pageviews where user_id = '92363' and article_id !~ /.*/;
我做错了什么或者我应该在数据库中配置什么?这似乎不对。用户活动的数量<100,我会手动更快地通过它们。
我目前正在运行默认配置。
感谢。
答案 0 :(得分:1)
使用!=
或=~
进行查询时,数据库必须与该标记的每个条目进行比较。如果您有2M条目,则会很慢。使用正则表达式(=~
)时,甚至更慢。
简而言之,不,你没有做错任何事。这些类型的查询在Influxdb中为O(n)
,其中n是您要比较的行数。
我建议您重新考虑您的架构以避免此类查询。例如,您可以设置一个整数标记has_article
,该标记可以是0
或1
,表示文章的存在。然后,查询可以使用has_article = 1
。
然后,数据集和数据模型是否适合潮流数据库是另一个问题 - 数据集似乎不是时间序列数据。
InfluxDB是一个专门的时间序列数据库,而不是通用数据存储。