memcached を使用して MySQL のデータをキャッシュする場合、アプリケーションはデータベースからデータを取得し、適切なキー/値ペアをキャッシュにロードする必要があります。その後の検索は、キャッシュから直接実行できます。
MySQL にはクエリーされたデータ用に独自のインメモリーキャッシュメカニズム (InnoDB
のバッファープールや MySQL クエリーキャッシュなど) が用意されているので、個々のカラム値や行のキャッシュへのロード以外の機能も使用できます。結合クエリーによって複数のテーブルから取得された値や複数の行から集められた結果セットなどの複合値のキャッシュにより適しています。
memcached インスタンス内の情報へのアクセスや情報の更新に必要なセキュリティーはないため、キャッシュ内の情報は機密扱い以外のデータに限定してください。マシンにアクセスできるすべてのユーザーが、情報を読み取り、表示し、場合によっては更新できます。データをセキュアな状態に保つには、情報をキャッシュする前に暗号化します。サーバーに接続できるユーザーを制限するには、ネットワークアクセスを無効にするか、IPTables または同様の手法を使用して memcached ポートへのアクセスを選択したホストのセットに制限します。
memcached
は、キャッシュが元の設計に組み込まれていなかった場合でも、既存のアプリケーションに導入できます。多くの言語および環境では、アプリケーションの変更はほんの数行です。最初にデータをロードするときにキャッシュからの読み取りを試行し、情報がキャッシュされていなかった場合は古い方法にフォールバックし、データを読み取ったらその情報でキャッシュを更新します。
どの言語でも、MySQL のキャッシュソリューションとして memcached を使用する一般的な手順は次のとおりです。
キャッシュから項目を要求します。
項目が存在する場合は、その項目データを使用します。
項目が存在しない場合は、MySQL からデータをロードし、その値をキャッシュに格納します。つまり、その値はキャッシュからそれを要求する次のクライアントで使用可能になります。
この手順のフローチャートについては、図16.8「一般的な memcached アプリケーションのフローチャート」を参照してください。
memcached アプリケーションへのデータベースのベストプラクティスの適用
MySQL のデータをキャッシュするもっとも直接的な方法は、2 カラムのテーブルを使用して、1 つ目のカラムを主キーにすることです。memcached キーの一意性要件のため、データベーススキーマで主キーと一意制約が適切に使用されていることを確認してください。
複数のカラム値を結合して 1 つの memcached 項目値にする場合は、値をそのコンポーネントに簡単に解析できるようなデータ型を選択してください (たとえば、数値間に区切り文字を使用するなど)。
memcached の検索にもっとも簡単にマップできるクエリーは、WHERE
句が 1 つで、=
または IN
演算子を使用するクエリーです。複雑な WHERE
句や、<
、>
、BETWEEN
、LIKE
などの演算子を使用するものの場合、memcached ではキーや関連する値を簡単または効率的にスキャンまたはフィルタする方法がないため、通常はこれらの操作をベースとなるデータベースに対する SQL クエリーとして実行します。