http://dev.mysql.com/doc/refman/5.1/en/memory-storage-engine.htmlにある機能の可用性リストを見ると、2つの問題が発生する可能性があります。
- トランザクションまたはFKのサポートはありません。つまり、独自のコードでトランザクションの整合性と参照の整合性を管理する必要があります(これは、アプリケーションに大きく依存しますが、DBにこれを行わせるよりもはるかに効率が悪くなる可能性があります)予想される行動パターン)。
- テーブルレベルのロックのみ:これは、アプリケーションが同じテーブルセットに対して複数の同時ライターを必要とする場合、または読み取り操作でロックを使用して一貫したデータの読み取りを保証する場合(そのような場合はディスクベースのテーブル)現在、十分なコンテンツがRAMにキャッシュされている場合は、ロックの粒度をより細かくサポートすることでパフォーマンスが大幅に向上します。
それ以外に、十分なRAMがあると仮定すると、メモリベースのテーブルはディスクベースのテーブルよりも高速になります。サーバーインスタンスがリセットされたときに何が起こるかという問題に対処するには、ディスクにスナップショットを作成することを考慮する必要があります。これは、データを頻繁にキャプチャする必要がある場合、全体的なパフォーマンスの利点を完全に無効にする可能性がありますそのようなインスタンスのデータは、1日に1回だけバックアップを取ることができますが、ほとんどの場合、これは受け入れられません)。
代替手段は次のとおりです。
- ディスクベースのテーブルを使用しますが、任意の時点でそれらをすべてRAMに保持するのに十分なRAMがあることを確認します(そして、「十分なRAM」は、マシン、OS IOバッファ/キャッシュなど)
- 各起動時にテーブルのコンテンツ全体(すべてのデータおよびインデックスページ)をスキャンして
SELECT * FROM <table> ORDER BY <pkey fields>
、各テーブルの後にSELECT <indexed fields> FROM <table> ORDER BY <index fields>
インデックスごとにコンテンツをメモリにプリロードします
この方法では、すべてのデータがRAMに格納されるため、書き込み操作のI / Oパフォーマンスのみを心配する必要があります。アプリの一般的なワーキングセットがDB全体よりもはるかに小さい場合(通常、ほとんどのアプリケーションでは、ほとんどのユーザーが最新のデータのみを見ることがあります)スキャンしてメモリにプリロードし、残りをオンデマンドでディスクからロードできるようにします。