2

私はカサンドラにかなり慣れていませんが、これまでのところ順調に進んでいます。

$conn = new ConnectionPool('Cluster');
$User = new ColumnFamily($conn, 'User');

$index_exp = CassandraUtil::create_index_expression('email', 'John@dsaads.com');
$index_clause = CassandraUtil::create_index_clause(array($index_exp));
$rows = $User->get_indexed_slices($index_clause);

foreach($rows as $key => $columns) {
echo $columns['name']."<br />";
}

このタイプのクエリを使用して、誰かの電子メールアドレスから特定の日付を取得しています。しかし、私は今、2つのことをしたいと思っています。

  1. データベース内のすべてのユーザーをカウントし、その数を表示します
  2. データベース内のすべてのユーザーを$columns['name']で一覧表示します。""。$columns['email']

mysqlでは、selectクエリから「where属性」を削除するだけですが、ここではもう少し複雑だと思いますか?

4

2 に答える 2

4

Cassandra では、すべての行を簡単にカウントする方法はありません。基本的にすべてをスキャンする必要があります。これが頻繁にやりたいことだとしたら、それは間違っています。コード例:

$rows = $User->get_range("", "", 1000000);
$count = 0;
foreach($rows as $row) {
    $count += 1;
}

2 番目の答えも同様です。

$rows = $User->get_range("", "", 1000000, null, array("name", "email"));
foreach($rows as $key => $columns) {
    echo $columns["name"]." ".$columns["email"];
}
于 2011-05-05T17:10:49.000 に答える
1

タイラー・ホッブズは非常に良い例を挙げています。

ただし、多くのユーザーがいる場合は、それらを常に反復する必要はありません。

この繰り返しを 1 日に 1 ~ 2 回行い、データを cassandra または memcached / redis に保存することをお勧めします。


また、単一行で CF を実行し、すべてのユーザー名 (またはユーザー キー) を単一行に配置します。ただし、これを奇妙な慣行と見なす人もいれば、推奨しない人もいます。次に、次のようにします。

$count = $cf->get_count($rowkey = 0);

get_count() も遅い操作なので、キャッシュする必要があることに注意してください。

get_count() が 100 を返す場合、phpcassa を最新バージョンにアップグレードする必要があります。


2番目の部分について-4000〜5000人のユーザーが少ない場合、私はもう一度奇妙なことをします-その後、スーパーカラムとして単一の行に配置します. 次に、 read は 1 つの操作だけで実行されます。

$users = $scf->get($rowkey = 0, new ColumnSlice("", "", 5000)); foreach($users as $user){ echo $user["name"]." ".$user["email"]; }

于 2012-08-11T18:39:42.980 に答える