Cassandralike clause.... in MySQL
には、データベース内のより具体的なデータを検索するような CQL はありません。
私はいくつかのデータを見て、いくつかのアイデアを思いつきました
1.Hadoopの利用
2.MySQLサーバーを別のデータベース サーバーとして使用する
しかし、Cassandra DBのパフォーマンスを簡単に向上させる方法はありますか?
Cassandra DB のパフォーマンスを改善するにはさまざまな方法がありますが、データを効率的にクエリする必要があるように感じます。これは、db 自体のパフォーマンスの調整とは関係ありません。
ご存知のように、Cassandra は nosql データベースです。つまり、これを扱う場合、高速な読み取り/書き込み、スケーラビリティ、フォールト トレランスのためのクエリの柔軟性が犠牲になります。つまり、データのクエリが少し難しくなります。データのクエリに役立つ多くのパターンがあります。
事前に必要なものを知っておいてください。CQL を使用したクエリは、RDBMS エンジンで見られるものよりも柔軟性がやや劣るため、高速な読み取り/書き込みを利用して、クエリするデータを複製することで適切な形式で保存できます。複雑すぎる?
Imagine you have a user entity that looks like that:
{
"pk" : "someTimeUUID",
"name": "someName",
"address": "address",
"birthDate": "someBirthDate"
}
そのようにユーザーを永続化すると、データベースに参加した順序で並べ替えられたユーザーのリストが取得されます (永続化されました)。同じユーザーのリストを取得したいとしますが、"John" という名前のユーザーのみです。CQL でそれを行うことは可能ですが、少し非効率的です。この問題を修正するためにここでできることは、データに対して実行するクエリに適合するように、データを複製して非正規化することです。詳細については、こちらをご覧ください。
http://arin.me/blog/wtf-is-a-supercolumn-cassandra-data-model
ただし、このアプローチは単純なクエリには問題ないように思えますが、複雑なクエリの場合は実現がやや難しく、また、何をクエリするかが事前にわからない場合は、事前に適切な方法でデータを保存する方法がありません。
Hadoop が助けになります。ご存じのように、hadoop の map reduce を使用して、大量のデータを含むタスクを解決できます。私の経験では、Cassandra データは非常に大きくなる可能性があります。Hadoop を使用して上記の例を解決するには、各 map メソッドでデータをそのまま反復処理して、ユーザーの名前が John かどうかを調べ、そうであればコンテキストに書き込みます。
擬似コードは次のようになります。
map<data> {
if ("John".equals(data.getColumn("name")){
context.write(data);
}
}
map メソッドの最後に、John という名前のすべてのユーザーのリストが表示されます。Hadoop にフィードするデータに時間範囲 (範囲スライス) を設定すると、特定の期間にデータベースに参加し、John という名前のすべてのユーザーが得られます。ご覧のとおり、ここでは柔軟性が大幅に向上し、実質的に何でもできます。取得したデータが十分に小さい場合は、要約データとして RDBMS に配置するか、どこかにキャッシュして、同じデータに対するさらなるクエリで簡単に取得できるようにすることができます。Hadoop の詳細については、次の URL を参照してください。