9

フィールドのあるテーブルがあります::ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP

私の質問は、このテーブルで遅延挿入を使用する場合、タイムスタンプはリクエストがキューに入れられた時間ですか、それとも実際に挿入が行われた時間ですか?

4

3 に答える 3

6

答えは、リクエストがキューに入れられたときですが、テーブルのスレッドがまだ存在しない場合、テーブルのスレッドが確立された後にリクエストがキューに入れられるため、リクエストが行われたときに必ずしも正しいとは限りません。

mysql 5.1 dev docsから:

スレッドは INSERT ステートメントを実行しますが、テーブルに行を書き込む代わりに、ハンドラー スレッドによって管理されるキューに最終行のコピーを入れます。構文エラーはスレッドによって通知され、クライアント プログラムに報告されます。

遅延ステートメントが実行されるときのイベントの順序:

  1. テーブルのハンドラー スレッドが存在しない場合は作成されます
  2. DELAYEDハンドラーがロックを確認するか、ロックを取得するために待機します
  3. ハンドラは を実行しINSERT、最後の行をキューに入れます
  4. 行が実際に挿入されると、バイナリログが更新されます
  5. ハンドラーは一度に行を書き込み、書き込み間のdelayed_insert_limit保留中を実行しますSELECTS
  6. キューが空になると、DELAYEDロックが解除されます

スレッドを作成する必要があるかどうか、およびDELAYEDロックの確認または取得にかかる時間によって、ステートメントの実行 (ステップ 0) からステートメントの実行 (ステップ 3) までの時間は異なります。次に、キューの大きさ (特にdelayed_insert_limit行を超えている場合) と、保留が発生するかどうかに応じSELECTSて、予測できない時間だけ書き込みが遅延します。

于 2010-12-10T16:20:41.460 に答える
1

が使用されているかどうかに関係なくINSERT DELAYED、または別のスレッドや更新などのためにテーブルがロックされている場合でも、値はが発行されtsた時間と同じになります。INSERT

于 2010-12-10T16:26:07.487 に答える
0

実際の挿入の時間がかかるはずです

于 2010-12-10T16:18:48.647 に答える