2017-09-28 11 views
0

私はInflux v1.3を使用しています。私は1ヶ月のタイムパンに〜2百万件のレコードと10個のタグを含む測定値を持っています。このうち、私はuser_idarticle_idに興味があります。空ではないタグでInfluxDBレコードを選択すると非常に遅くなります

が空でない特定のuser_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です。私は文字通り、手作業でより速くそれらを通過しました。

現在、デフォルト設定が実行されています。

ありがとうございました。

答えて

1

!=または=~を使用するクエリでは、DBはそのタグの各エントリと比較する必要があります。 2Mのエントリがある場合は遅くなります。正規表現(=~)を使用すると、さらに遅くなります。

要するに、あなたは間違ったことはしていません。これらのタイプのクエリは、influxdbのO(n)です(nは比較する行の数です)。

このようなクエリを避けるためにスキーマを再考することをお勧めします。たとえば、記事の存在を示す整数タグhas_article0または1のいずれかに設定できます。クエリでは、has_article = 1を使用できます。

また、データセットとデータモデルがinfluxdbに適しているかどうかは別の質問です。データセットは時系列データではないようです。

InfluxDBは、汎用データストアではなく、特殊な時系列DBです。

+1

ありがとうございます。私はそれがクエリを最適化し、フィルタリングされた〜100のイベントに対してタグをチェックすると期待しますが、おそらくSQLのdatabazeとは違った働きをします。ブール値の回避策は十分です。 1.4にはタグに使用できる 'SHOW CARDINALITY'が含まれていることが分かりましたので、私はそのオプションも紹介します。どうもありがとう! – rootpd

関連する問題