2012-03-13 6 views
2

私はLinuxでCプログラミングを行っていて、非常に高速なルックアップ速度が必要な問題に直面しました。通常のMySQLのテーブルのような'定数データベース'の高速インデックスフォーマット

テーブルの場合は、次のようになります。

ID name age sex score_a score_b score_c date 

、それは、このテーブルが作成されたと全く更新が許可されなかった後を意味し、定数です。それは読書のためだけに役立つ。それは一定であったので、インデックス用のほとんどのデータベースで実装されている 'Bツリーインデックス'ではなく、条件(年齢、得点など)をより早く検索するためのより良いインデックスフォーマットが必要であると思います。

+2

ハッシュが唯一の方法になります。 – PasteBT

+0

@PasteBTハッシュはフィルタリングをサポートできません。おそらく私にとってはそうではないと思います。 –

+0

私はさらに詳しい情報が必要です。 「速い」と「十分に速くない」とはどういう意味ですか?どのような種類のクエリを実行していますか、フィルタはどれほど複雑ですか?あなたは同じ質問を繰り返し実行していますか、それとも非常に変化していますか? –

答えて

0

あなたの質問に私のコメントを見てください。要するに、データが一定であれば、それに対して実行する必要があるクエリはかなり一定であると仮定します。

ほとんどの現代のRDBMSは、何らかの形のクエリキャッシングをサポートしています。もしあなたがそうでなければ、あなたはmemcachedのようなものにクエリの結果をキャッシュすることができます。キャッシュの生成は遅くなりますが、キャッシュルックアップがローカルに保持されていると、索引ルックアップ(通常はO(1))と比較して非常に高速になります。

+0

'高速'は、クエリキャッシュがオフのほとんどのデータベースインデックス(MySQLなど)よりも速いことを意味します。 –

+0

私はそれより具体的なものが必要です。あなたの受け入れ基準は何ですか?現在の「遅さ」が引き起こしている大きな問題は何ですか? –

1

範囲ベースの検索(「10〜12歳、13〜15歳など」、「40〜60,61〜70などのスコア」など)や単一値検索( '名前はクエンティン・スミス」)、またはその両方?単一値検索の場合、ハッシュは適切かつ高速です。特にレンジベースの検索では、Bツリーとそのバリアントが最良の傾向があります。

元のデータの1行あたり50バイトの領域を探しているので、1GBから15GBのデータを扱うことになります。その範囲の上端にある場合は、プレーンデータをメモリに保持するために大きなマシンを必要とします。範囲の下端では、それは妥当性の範囲内にあります。各列を索引付けすると仮定すると、索引は生データ(おそらく50%以上)よりも少しスペースを取る可能性があります。もちろん、名前の索引は最大です。レコードの配列のインデックスとしてIDカラムを使用することができれば、IDカラムにインデックスは必要ないかもしれませんが、おそらくデータにギャップがあるため、とにかく索引付けするのが最もよいでしょう。

関連する問題