2010-12-10 16 views
9

私はフィールドを持つテーブルを持っている:: ts TIMESTAMP DEFAULT CURRENT_TIMESTAMPmysqlの遅れ挿入タイムスタンプ

私の質問は、私は、このテーブルの上に遅延挿入を使用している場合、タイムスタンプは要求がキューイングされている時刻または時間ときになります、です挿入は実際に行われますか?

答えて

6

の時間を取る必要がありますそれがまだない場合はmysql 5.1 dev docsから

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

遅れ文が実行されるイベントの順序:すでに1

  • のハンドラチェックがない場合

    1. テーブルのハンドラスレッドが作成されるかDELAYEDを得るために待ちますロック
    2. ハンドラはINSERTを実行し、最後の行をキューに入れます。
    3. 実際に行が挿入されると、バイナリログが更新されます
    4. は、ハンドラが一度にdelayed_insert_limit行を書き込み、実行キューが空の場合、DELAYEDロックが

    がスレッドを作成する必要があるかどうかに応じてかないとどのように解放され

  • 書き込みの間、保留中のSELECTS文章の実行(ステップ0)と文の実行(ステップ3)との間の時間は変化するので、DELAYEDロックを確認または取得するのに時間がかかります。次に、キューの大きさ(特に、delayed_insert_limit行以上の場合)と、保留中のいずれかがあるかどうかに応じて、書き込みは予期しない時間だけ遅延します。

  • +0

    私はあなたが正しいと思っています(しかしわかりません)。スレッド*がステートメントを実行して*レポート*構文エラーがあれば、実際にはCURRENT_TIMESTAMPも実際のタイムスタンプに「展開」するためです。 –

    0

    これは、テーブルのスレッドが確立された後、要求がキューイングされているように、要求がキューに登録されたときに答えはあるが、要求が行われたときにそれは必ずしも正しくありません、実際の挿入

    1

    にかかわらずINSERT DELAYEDを使用する、またはテーブルが原因他のスレッドまたは更新またはその他もろもろにロックされている場合、値tsがかかる場合INSERTが発行された時間に等しいです。

    +0

    実際にデータベースで行われたハンドラスレッドまたはINSERTによって作成された「ダミー」INSERTを意味しますか? –

    +0

    コマンドがクライアントスレッドによって発行されたとき。 – Riedsio