質問: Cassandra 3.xのSecondary Indexのディスク使用量の見積りで困っています。 DataStaxのcommiterであるTyler Hobbs氏が0.7に関しては以下の様に回答しています。 > > Their size will roughly be: > > (cardinality of the set of indexed values * the avg size of the index values) + (the number of keys in the indexed column family * the avg size of keys in the column family). > > Nodes only index rows that are stored locally -- that is, only rows for which they are a replica. > > > ここでの(the number of keys in the indexed column family * the avg size of keys in the column family) で使用されているkeysはインデックス作成対象テーブルのPrimary Keyに含まれるカラムという認識で正しいでしょうか。 また、これはVer3.xでも有効でしょうか。 よろしくお願いいたします。
回答: Cassandraのセカンダリーインデックスは転置インデックスです。 例えば、以下のようなテーブルがあり、 ``` CREATE TABLE users ( user_id text, name text, group text, PRIMARY KEY (user_id) ); ``` このテーブルにインデックスを作成します。 ``` CREATE INDEX users_by_group ON users (group); ``` すると、Cassandraの各ノードは、そのノードが保持しているusersテーブルのデータに対して以下のような内部テーブルを作成します。 ``` CREATE TABLE users_by_group ( user_id text, group text, PRIMARY KEY ((group), user_id) ); ``` そして、インデックスを用いたSELECTの際に、インデックスのテーブルをまず検索し、元テーブルのプライマリーキー情報を取得します。 そして、取得したプライマリーキーで改めて、元テーブルを検索します。 したがって、質問にある > > ここでの(the number of keys in the indexed column family * the avg size of keys in the column family)で使用されているkeysはインデックス作成対象テーブルのPrimary Keyに含まれるカラムという認識で正しいでしょうか。 > > > keys はおっしゃる通りPrimary Keyに含まれるカラムです。 この構造は Ver3.x でも変わっていません。