私はデータベース スキーマの設計に関して多くの経験を持っていません。MySQL に関してもそうではありません。
したがって、私の質問は次のとおりです。「国、都市、性別-男性/女性/未定:Pなどの静的なデータセットがある場合、メモリ内にこの比較的小さなテーブルを作成すると、有利になるでしょうか? "
私はデータベース スキーマの設計に関して多くの経験を持っていません。MySQL に関してもそうではありません。
したがって、私の質問は次のとおりです。「国、都市、性別-男性/女性/未定:Pなどの静的なデータセットがある場合、メモリ内にこの比較的小さなテーブルを作成すると、有利になるでしょうか? "
簡単に言えば、いいえ。アクセスの頻度に基づいて、少量の読み取りがほとんどのデータがキャッシュされるか、バッファーに配置されるためです。
メモリ テーブルは、MySQL サービスの再起動時にも空になるため、サービスの起動ごとに少なくとも 1 回データを設定する必要があります。
MySQL メモリ テーブルは、特定のテーブルを中心とした非常に大量の演算または IO があり、サーバーがクラッシュまたは再起動した場合にデータが失われる可能性があるため、本当に IO を回避したい場合に最も役立ちます。サービスの再起動時に消去されるため、使用が制限されている MEMORY テーブル。
InnoDB テーブルが最も安全な選択です。
サーバーのシャットダウン後もデータを保持する必要がある場合、これらのテーブルをメモリ内に作成しても役に立ちません。メモリ テーブルは、一時データの格納にのみ使用してください。ただし、ベース データをディスク ベースのテーブルに格納し、何らかのプロセスを使用してデータをメモリ テーブルにロードしてアクセスを高速化することはできませんでした。
ただし、これは私には大変な作業のように思えます。
適切に索引付けされたディスクベースのテーブルを使用している
インデックス全体がメモリに常駐するのに十分なメモリを割り当てます
インデックスを常に適切に利用するようにクエリを設計する
MySQL のクエリ キャッシュを利用する
比較的小さなサイズのテーブルでは、パフォーマンスが大幅に向上することはほとんどありません。
これは良い質問ですが、個々のユース ケースに大きく依存するため、簡単に答えることはできません。ほとんどの場合、答えはノーです。
MEMORY エンジンは、その名前が示すように、通常のストレージとは少し異なり、データをディスクではなくメモリに格納します。デフォルトでは、非常に高速なハッシュ ベースのインデックス システムを使用します (ただし、バイナリ ツリー インデックスも使用できます)。 )。
MEMORY エンジンは一時テーブルの作成には優れていますが、サーバーがシャットダウンするとデータは失われます。これにより、アプリケーション ロジックに余分な作業が発生し、データが存在しているかどうかを確認し、データがない場合はデータを入力します。
はるかに優れたアプローチは、通常のデータベース ストレージ タイプを使用し、適切なインデックスを使用することです。これにより、迅速に処理できます。頻繁に使用する場合は、キャッシュを検討することもできます。
MEMORY テーブルにはいくつかの重要な制限があります。
いいえ。通常のテーブルを作成し、SQL_CACHE を使用してパフォーマンスを向上させます。
SELECT SQL_CACHE id, name FROM customer;
結果はパフォーマンスを向上させるためにメモリにキャッシュされますが、データは引き続きハード ドライブに保持されます。
参照: http://dev.mysql.com/doc/refman/4.1/en/query-cache-in-select.html
更新[ 詳細情報を追加 ]
my.cnf には、クエリ キャッシュ タイプに設定できる値が 3 つあります。
query_cache_type = 0 --> query cache is totally off. MySQL won't cache anything at all.
query_cache_type = 1 --> query cache is on by default. you have to use SQL_NO_CACHE hint to disallow caching some queries (e.g., highly dynamic queries)
query_cache_type = 2 --> query cache is off by default. you have to use SQL_CACHE hint to allow caching.
デフォルトでは、その値は 1 (オン) です。
ただし、メモリは制限されます。そのため、キャッシュするクエリとキャッシュしないクエリを mysql に伝えることをお勧めします。たとえば、国リストをキャッシュしたいが、そのための memcache が既にある場合は、プロファイル クエリをキャッシュしたくない場合があります。ここでキャッシュヒントを使用することは非常に理にかなっています。