2011-12-19 26 views
3

私はネットワークのオーバーヘッドなしで、効率的かつ非常に高速なアクセスのために、いくつかの情報を異なるマシンに配布しようとしています。データはリレーショナルスキーマに存在し、エンティティ間のリレーションに「参加」する必要がありますが、データベースに書き込む必要はありません(オフラインで生成されます)。高速読み込み専用埋め込み "データベース"?

私はSQLiteがパフォーマンス上で提供すると確信していましたが、RDMBSは根本的なレベルでは不適切と思われます。インデックスの参照コストのためにジョインが非常に高価で、読み取り専用のコンテキストでは不要なオーバーヘッドですここでエンティティはファイルオフセットの形で互いに直接参照を格納することができます。このようにして、ファイルシークのためにインデックスルックアップが切り替えられる。

ここには何がありますか?データベースは実際に私が探しているものを記述しているようではありません。私はNeo4jを認識していますが、私のアプリにJavaを埋め込むことはできません。

TIA!

編集、コメントに答える:

  • データのサイズが1GBまでとなり、わたしはそう本当にオプションではありませんメモリ内のデータを維持するPHPを使用しています。私はOSのバッファキャッシュを利用して、ディスクへの継続的な移動を避けます。
  • 例としては、15種類の混合タイプのフィールドを持つProductテーブルと、特定のmakeを持つ製品をリストしてCategoryテーブルに結合するクエリがあります。
  • 解決策は、何らかの種類のフラットファイルでなければなりません。私のニーズを満たすソフトウェアがすでに存在するのだろうかと思っています。

@マークウィルキンス:

パフォーマンスの問題が測定されます。基本的には、私の状況では、2msのIOバインドされたクエリをMemcacheに置き換えることはできません。たとえば、カテゴリテーブルには親と子のカテゴリを含む500レコードがあります。次のクエリは、ディスクIOなしで約8msかかります。SELECT 1 FROM categories INNER JOINカテゴリB on b.id = a.parent_id。いくつかのシンプルで結合のないクエリは非常に高速です。

+0

これはリレーショナルスキーマであり、リレーションシップに参加する必要がありますが、リレーショナルデータベースは使用したくないと言っていますか?なぜフラットファイルを使用しないのですか? – Oded

+0

"DB"の例と近似サイズを指定してください。 – CAFxX

答えて

1

必要なクエリの種類について目標が完全に明確ではない場合があります。しかし、ファイルのオフセットを他のデータに格納することは、維持したりデバッグするのが難しい非常に脆弱な解決策になるようです。それを助けるツールがいくつかあるかもしれませんが、私の疑念はあなたが自分でそれを大部分書くことになるということです。他の誰かが後に来て、自作のファイル形式をデバッグして調べなければならない場合、それはより多くの作業になります。

しかし、私の最初の考えは、記述されたパフォーマンスの問題がこの時点で推定されているか、実際に測定されているかどうか疑問に思うことです。リレーショナル形式のデータを使ってテストを実行して、実際の速さを確認しましたか?ほとんどの場合、結合はより多くのファイルの読み込み(前述のバイナリ検索を行い、関連するレコード情報を取得してそのレコードを参照する)が必要です。これは、最初に4つまたは5つ以上のディスク操作を取ることができます。しかし、(OPの)カテゴリテーブルでは、一般的にヒットした場合にキャッシュされる可能性があります。これは私のところで完全に推測されていますが、多くの場合、カテゴリの数は比較的少ないです。これがここに当てはまる場合、カテゴリテーブル全体とそのインデックスは、OSによってメモリにキャッシュされたままになる可能性があり、その結果、非常に高速な結合が行われます。

パフォーマンスが本当に問題になる場合は、別の可能性がありますdenormalize the data。カテゴリの例では、カテゴリの値/名前を複製し、それを各製品レコードに格納します。その結果、データベースのサイズは大きくなりますが、埋め込みデータベース(there are a number of possibilities)を使用することはできます。賢明に実行された場合でも、それは依然として合理的に良好に維持され、1回のルックアップ/シークと1回の読み取りで完全なオブジェクトを読み取る能力を提供することができる。

1

一般に、おそらく最も早いのは、データを非正規化して、JOINや他の多テーブル検索を避けることです。

SQLiteを使用すると、あらゆる種類のものをカスタマイズしてニーズに合わせることができます。たとえば、1つのスレッドのみでアクセスしたり、メモリキャッシュサイズを上げたり、インデックスをカスタマイズしたり(不要なメタデータを無効にするためのカスタムビルド、デバッグなど)、すべてのミューテックスを無効にしてください。

これはもちろんデータベースが必要としていることを前提としています。

+0

非正規化は、データのサイズをどれだけ大きくするかによってオプションではありません。 – Scott

+0

正規化がオプションではない場合でもリストされた箇条書き項目を見直すように繰り返します(ただし、データのマイナス点を非正規化してわずかなスペースコストで大幅なスピードアップ)。あなたのニーズに合わせてSQLiteのビルド+プラグマの設定などをカスタマイズします。 EXPLAINを使用してすべてのクエリを解読し、スピードに合わせて調整し、クエリプランナを使用します。 – NuSkooler

関連する問題