1

ほぼ空の InnoDB テーブルで一連の UPDATE コマンドを実行していますが、20 ~ 30 クエリごとに約 1 クエリが他のクエリの 10 倍の時間がかかります。たとえば、最初の 20 回の更新には 20 ミリ秒かかり、21 回目の更新には突然 200 ミリ秒かかります。私は信じられないほど基本的なテストを設定しました:

CREATE TABLE `test` (
  `col1` int(11) DEFAULT NULL,
  `col2` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

テーブルに 1 つの行を挿入すると、一連の更新を行う C# コンソール プログラムが作成されます。

for (int i = 0; i < 15; i++) {
   long start = CurrentTimeMillis();

   MySqlCommand cmd = new MySqlCommand();
   cmd.Connection = conn;
   cmd.CommandText = "UPDATE test SET col1=" + i + " WHERE col2=1";
   cmd.Prepare();
   cmd.ExecuteNonQuery();

   Console.WriteLine("Duration: " + (CurrentTimeMillis() - start));
}

これは私がプログラムから見る出力です:

MySQL version : 5.5.17
Duration: 36
Duration: 30
Duration: 16
Duration: 26
Duration: 152
Duration: 47
Duration: 71
Duration: 77
Duration: 46
Duration: 28
Duration: 21
Duration: 25
Duration: 17

「SHOW profile FOR QUERY #」を実行すると、「更新中」と「クエリ終了」の両方の値が異常に高くなります。

テーブルを MyISAM に切り替えると、クエリの実行時間は一定になりますが、テーブル ロックは必要ありません。何が InnoDB をこのように動作させているのか、誰にも推測できますか?

4

1 に答える 1

0

innodb_flush_methodが設定されていない限り、更新はメモリ内 (バッファ プール内) で実行されます - 更新はO_DIRECTバイナリ ログ (クラッシュの場合に再生される) に記録され、1 秒ごとにディスクにフラッシュされます (デフォルト)。これは、この時点でディスク I/O が発生するため、毎秒 1 回の更新が遅くなることを意味します。

于 2013-07-06T18:28:24.710 に答える