大規模データセットの高速クエリ: MySQL MEMORY (HEAP) エンジン、MyISAM、またはその他のもの (例: MemCached)

大規模データセットの高速クエリ: MySQL MEMORY (HEAP) エンジン、MyISAM、またはその他のもの (例: MemCached)

現在、SNOMED と呼ばれる医学用語を中心としたプロジェクトに取り組んでいます。SNOMED の中心にあるのは、長さが 350,000 用語/レコードの (リレーショナル) データセットです。このデータセットに対して、何らかの自動補完/提案形式が必要なデータ入力部分をすばやくクエリできるようにしたいと考えています。

現在は開発目的のためだけに MySQL MyISAM DB にありますが、メモリ内オプションをいくつか試してみたいと思います。現在はインデックスを含めて 30MB です。MEMORY MySQL Engine と MemCached が当然の選択肢ですが、私の質問は、どちらをお勧めしますか、またはもっと良いものがあるでしょうか。私たちは主にアプリ レベルで Python を使っていますが、それが違いを生むかどうかはわかりません。

補足: データセットには、これらの概念を一般的なエイリアス名と略語にマッピングする別のリレーションがあり、そのレコード数は約 130 万件です。最終的には、ここでもこのサブセットを使用することになります。

答え1

要件が正確に何であるかは不明ですが、データベースが小さい場合、すべてのデータがメモリに収まるため、どのエンジンでもクエリが高速になる可能性があります。

MyISAM や InnoDB のようなものは、動作させるためにはある程度の調整が必要です。Memcached は、非常に高負荷の読み取りベースのワークロード、つまり従来のインメモリ データベースから単一のサーバーで処理するには高すぎるワークロードに拡張する必要がある場合にのみ役立ちます (Memcached の主な機能は、サーバーのプール全体に拡張できることです)。ただし、me​​mcached は範囲スキャンなどの従来のクエリを実行できず、特定のキーの検索のみを実行できるため、汎用データベースではありません。

データ セットよりも大きいバッファー プールを持つ InnoDB を使用し、主キーを正しく選択することをお勧めします。主キー範囲スキャンは非常に適切に実行され、プレフィックス マッチング (補完ユースケースなど) に使用できるはずです。

通常のハードウェアでは、たとえば 1 秒あたり 1000 クエリまで拡張できます。さらに必要な場合は、レプリケーション スレーブを追加するか、memcached のようなものを検討してください。

StackOverflow で質問することを検討しますか?

答え2

テーブルを MEMORY タイプとして保持できます。これはかなり高速ですが、使用前にシードする必要があります。これにより、パフォーマンスが大幅に向上すると思います。メモリ内にあるため、読み取り操作では InnoDB や MyISAM よりも確実に高速です。

いくつかの異なる方法を試してみて、ApacheBench で検索をオーバーロードし、圧力に最も早く屈服するものを確認することをお勧めします。

関連情報