ほぼ空の 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 をこのように動作させているのか、誰にも推測できますか?