4

次のテーブル構造を持つ 5 億行の MySQL テーブルを考えてみましょう ...

CREATE TABLE foo_objects (
  id int NOT NULL AUTO_INCREMENT,
  foo_string varchar(32),
  metadata_string varchar(128),
  lookup_id int,
  PRIMARY KEY (id),
  UNIQUE KEY (foo_string),
  KEY (lookup_id),
);

...次の2つのクエリのみを使用してクエリされています...

# lookup by unique string key, maximum of one row returned
SELECT * FROM foo_objects WHERE foo_string = ?;
# lookup by numeric lookup key, may return multiple rows
SELECT * FROM foo_objects WHERE lookup_id = ?;

これらのクエリが与えられた場合、Cassandra を使用して特定のデータセットをどのように表現しますか?

4

1 に答える 1

2

次の 2 つのオプションがあります。

(1) は伝統的なものです: foo オブジェクトに 1 つの CF (columnfamily) を持ち、foo ごとに 1 行、フィールドごとに 1 列を持ちます。次に、2 つのインデックス CF を作成します。一方の行キーは文字列値で、もう一方の行キーは lookup_id です。インデックス行の列は foo id です。したがって、インデックス CF に対して GET を実行してから、返された ID に対して MULTIGET を実行します。

id を lookup_id と同じにすることができれば、維持するインデックスが 1 つ少なくなることに注意してください。

Digg の lazyboy ( http://github.com/digg/lazyboy ) のような高レベルのクライアントは、インデックス CF の保守を自動化します。Cassandra 自体はこれを (まだ) 自動的に行いません。

(2) は (1) と似ていますが、foo オブジェクト全体をインデックス行のサブ列に複製します (つまり、インデックスの最上位列はスーパー列です)。実際に foo id 自体でクエリを実行していない場合は、独自の CF に格納する必要はまったくありません。

于 2010-03-10T23:01:15.263 に答える