考慮しなければならないことの1つは、MySQLがその主要なストレージエンジン(InnoDBとMyISAM)にバッファーをどのように使用するかです。
メモリにキャッシュされるものは、これらのストレージエンジン間で大きく異なります。
InnoDBはデータとインデックスページの両方をキャッシュします。これらは、innodb_buffer_pool_sizeによってサイズが設定されたInnoDBバッファープールにロードされます。
MyISAMテーブルにはインデックス・ページだけをキャッシュし、それらがによって大きさでキーキャッシュ(キーバッファ)にロードされているkey_buffer_sizeは。
InnoDBバッファープールとMyISAMキーキャッシュのサイズを正しく設定するには、information_schema.tablesを使用して、ディスク上で占有されているデータとインデックスのサイズを取得する必要があります。
保持しているデータの量と許容時間に応じて、次のようにキャッシュをウォームできます。
すべてのテーブルTableT
- 各インデックスNDXに移動
- 各インデックスNDX
- NDXのすべての列に対して SELECTを実行します。少なくとも1つの列がTableTからTableTでインデックス付けされていません
これにより、すべてのデータとインデックスページが少なくとも1回読み取られることが保証されます。彼らはキャッシュに座ります。この概念は、一部および原則として、Perconaによって実践されています。Perconaはこの概念をmk-slave-prefetchに組み込みました。このプログラムが行うことは
- スレーブ内のSQLを処理するスレーブの前にスレーブのリレーログを読み取る
- リレーログからSQLステートメントを取得し、インデックスを選択するためのガイドとしてWHERE、GROUP BY、およびORDER BY句を使用してSELECTに変換します。
- 変換されたSQLからのSELECTステートメントを実行する
これにより、スレーブはSQLを迅速に処理するためにスレーブが必要とするデータの99.99%を保持することになります。これにより、手動でスレーブにフェイルオーバーし、マスターに昇格した場合に、スレーブが準備されます。キャッシュは、フェイルオーバーしたマスターと同じものである必要があります。
結論
INSERT、UPDATE、DELETEの負荷が高い環境で使用できるキャッシュの準備が整っていて、意欲的であり、それを実現できることは何にも勝るものです。
試してみる !!!
警告
memcachedなどの製品の誕生により、MySQLの適切なチューニングを実行する必要がなくなった製品もあります。確かに、開発者がmemcachedをすぐに目にしたように、多くのサイトは、データのキャッシュ動作を制御することによって提供されるデータ検索の向上から恩恵を受けています。他の多くのサイトは、ストレージエンジンを切り替えるか、MySQLを正しく構成するだけで、同じパフォーマンス上の利点を実現しています。データベースをあきらめて、それをリポジトリとして厳密に使用する前に、データベースを最大限に活用してください。デューデリジェンスをたどると、MySQLがあなたのために何をするのか、うれしい驚きがあるかもしれません。