MySQL 5.1.25
の時点では、準備済みステートメントによって参照されるテーブルまたはビューへのメタデータ変更が検出され、それによって、次回の実行時にそのステートメントの自動再準備が実行されます。これは、PREPARE
ステートメントを使用して SQL
レベルで処理される準備済みステートメントと、mysql_stmt_prepare()
C API
関数を使用してバイナリのクライアントサーバープロトコルで処理される準備済みステートメントに適用されます。
メタデータ変更は、テーブルの作成、削除、変更、名前の変更、または切り詰めや、テーブルの解析、最適化、または修復などを実行する
DDL
ステートメントで発生します。再準備はまた、参照されたテーブルまたはビューが、キャッシュ内に新しいエントリの領域を確保するために暗黙的に、または
FLUSH
TABLES
のために明示的にテーブル定義キャッシュからフラッシュされたあとにも発生します。
再準備は自動的に実行されますが、発生の程度に応じて、準備済みステートメントのパフォーマンスは低下します。
ステートメントが再準備される場合は、元の準備で有効であったデフォルトデータベースと SQL モードが使用されます。
テーブルコンテンツの変更
(たとえば、INSERT
または UPDATE
による) では再準備は発生せず、また
SELECT
ステートメントでも発生しません。
以前のバージョンの MySQL
との非互換性として、準備済みステートメントによって、ある実行と次の実行で異なるカラムセットまたは異なるカラム型が返される可能性があるという点があります。たとえば、準備済みステートメントが
SELECT * FROM t1
の場合、異なるカラム数を含むように
t1
を変更すると、次の実行では前の実行とは異なるカラム数が返されます。
旧バージョンのクライアントライブラリでは、この動作の変更を処理できません。自動再準備を実行するサーバーで準備済みステートメントを使用するアプリケーションの場合は、新しいクライアントライブラリにアップグレードすることを強くお勧めします。
Com_stmt_reprepare
ステータス変数は、再準備の数を追跡します。