同じクエリの後続の実行がより速く実行されているという観察は、必ずしもクエリ結果がキャッシュされていること、またはクエリの後続の実行がクエリキャッシュから返されていることを意味するわけではありません。
クエリの最初の実行時に、アクセスする必要のあるインデックスやデータ ブロックが InnoDB バッファー プールまたは MyISAM キー キャッシュになく、ディスクから取得する必要があった可能性があります。これらのブロックは、MySQL クエリ キャッシュから完全に独立して、InnoDB バッファー プールと MyISAM キー キャッシュに残ります。これらのブロックがまだメモリ内にある場合、それらのブロックへの後続のアクセスはより迅速に戻る可能性があります。
通常、パフォーマンスを測定するために InnoDB バッファー プールまたは MyISAM キー キャッシュからブロックをフラッシュすることは望ましくありません。むしろ、クエリを複数回実行し、最初の実行の時間を捨てる必要があります。
InnoDB バッファー プールまたは MyISAM キー キャッシュにブロックがない状態で開始する場合は、MySQL サーバーをシャットダウンして再起動します。
しかし、これらのブロックが InnoDB バッファ プールまたは MyISAM キー キャッシュにない場合でも、それらのブロックが OS ファイル システム キャッシュの「メモリ」に残っている可能性があります。したがって、ディスクからブロックを読み取っていることを確認するには、OS ファイル システムのキャッシュもフラッシュする必要があります。
以下は、Oracle に関する Tom Kyte (AskTom) の記事からの抜粋ですが、同じ理由が他の RDBMS システム (MySQL を含む) にも当てはまります。
http://www.oracle.com/technetwork/issue-archive/o43asktom-094944.html
キャッシュをフラッシュする
Q: [バッファ キャッシュ] をフラッシュする方法はありますか? ... これは、いくつかの方法を次々と試すチューニング作業にとって重要ですが、データベースを再起動せずにバッファ内の既存のブロックの影響を減らしたいと考えています。
A:実際には、チューニング ツールがそれを行わないことが重要です。テストを実行し、結果を無視してから、2 ~ 3 回実行してそれらの結果を平均することが重要です。現実の世界では、バッファ キャッシュに結果がないことは決してありません。一度もない。チューニングするときの目標は、論理 I/O (LIO) を削減することです。これは、物理 I/O (PIO) がそれ自体を処理するためです。
次のことを考慮してください。共有プールとバッファ キャッシュをフラッシュすることは、フラッシュしない場合よりも人工的です。ほとんどの人はこれに懐疑的であるように思われます。これを行う方法を説明しますが、テストに使用できるようにするためではありません。むしろ、それが無益で完全に人為的な演習である理由を示すために使用します (したがって、間違った仮定につながります)。PC を起動したばかりで、大きなテーブルに対してこのクエリを実行しました。バッファ キャッシュを「フラッシュ」して、もう一度実行します。