フィールドのあるテーブルがあります::ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP
私の質問は、このテーブルで遅延挿入を使用する場合、タイムスタンプはリクエストがキューに入れられた時間ですか、それとも実際に挿入が行われた時間ですか?
フィールドのあるテーブルがあります::ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP
私の質問は、このテーブルで遅延挿入を使用する場合、タイムスタンプはリクエストがキューに入れられた時間ですか、それとも実際に挿入が行われた時間ですか?
答えは、リクエストがキューに入れられたときですが、テーブルのスレッドがまだ存在しない場合、テーブルのスレッドが確立された後にリクエストがキューに入れられるため、リクエストが行われたときに必ずしも正しいとは限りません。
スレッドは INSERT ステートメントを実行しますが、テーブルに行を書き込む代わりに、ハンドラー スレッドによって管理されるキューに最終行のコピーを入れます。構文エラーはスレッドによって通知され、クライアント プログラムに報告されます。
遅延ステートメントが実行されるときのイベントの順序:
DELAYED
ハンドラーがロックを確認するか、ロックを取得するために待機しますINSERT
、最後の行をキューに入れますdelayed_insert_limit
保留中を実行しますSELECTS
DELAYED
ロックが解除されますスレッドを作成する必要があるかどうか、およびDELAYED
ロックの確認または取得にかかる時間によって、ステートメントの実行 (ステップ 0) からステートメントの実行 (ステップ 3) までの時間は異なります。次に、キューの大きさ (特にdelayed_insert_limit
行を超えている場合) と、保留が発生するかどうかに応じSELECTS
て、予測できない時間だけ書き込みが遅延します。
が使用されているかどうかに関係なくINSERT DELAYED
、または別のスレッドや更新などのためにテーブルがロックされている場合でも、値はが発行されts
た時間と同じになります。INSERT
実際の挿入の時間がかかるはずです