influxdb.cardinality() メソッドによって返される値と、ドキュメントの定義に基づいて計算する値との間に不一致が見られるため、バケットのシリーズカーディナリティを計算するための正しいアプローチを理解しようとしています。
ドキュメント (このビデオでも TSM エンジンについて説明しています) によると、シリーズ カーディナリティは、InfluxDB バケット内の一意の測定、タグ セット、およびフィールド キーの組み合わせの数です。
1 つのタグと 2 つのフィールド キーのみで測定し、データを次のように仮定します (行形式)
m1,loc=abc speed=10,temp=20 m1,loc=xyz speed=10,temp=20
定義に基づいて、このバケットのシリーズのカーディナリティは 4 (1 つの測定値 * 2 つの一意のタグ値 * 2 つのフィールド キー) であると予想していました。
ただし、influxdb.cardinality() 関数を使用すると、シリーズのカーディナリティが 2 (1 測定 * 2 固有タグ) になります。これは、シリーズが複数のフィールドであるという印象を与えます。
import "influxdata/influxdb"
influxdb.cardinality(
bucket: "test-cardinality",
start: -4h
)
実は、答えはいいえです。つまり、InfluxDB シリーズのカーディナリティは、測定のフィールド キーの数に依存しません。
influx_inspect の reporttsi は、「データベース内の正確な系列カーディナリティの合計」を報告します。データベース内の正確な系列カーディナリティの合計を計算します。
コード層を層ごとにドリルダウンできます。ここの reporttsi コードから、システムがすべてのシャードを反復処理してから、すべての測定値を反復処理して、それらのシリーズ ID を計算していることがわかります。シリーズ ID は、こちらのコードで定義されています。測定とタグのみに関連していることがわかります。
// CreateSeriesListIfNotExists creates a list of series in bulk if they don't exist.
// The returned ids slice returns IDs for every name+tags, creating new
series IDs as needed.
func (f *SeriesFile) CreateSeriesListIfNotExists(names [][]byte, tagsSlice
[]models.Tags) ([]uint64, error) {