1

mysql/innodb での挿入クエリが、かなり強力な CPU を備えたマシンで少なくとも 40 ミリ秒持続する正確な原因は何なのか疑問に思っています。「同等の」クエリは、同じ MyISAM テーブルで 10 ミリ秒未満で実行されます (テーブルには外部キーがありません)。タイミングは MySQL コンソールからのものです。

これは、再現のための「できるだけ単純な」db 構造です。

CREATE TABLE `test_table_innodb` (
  `id` int NOT NULL AUTO_INCREMENT,
  `int_column` int NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `test_table_myisam` (
  `id` int NOT NULL AUTO_INCREMENT,
  `int_column` int NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

mysql コンソールから同じクエリを実行しています (InnoDB の場合はトランザクションを自動コミットします)。その時点で他のクエリはマシン上で実行されておらず、結果は次のとおりです。

 mysql> insert into test_table_myisam (int_column) values (5);
 Query OK, 1 row affected (0.00 sec)

 mysql> insert into test_table_innodb (int_column) values (5);
 Query OK, 1 row affected (0.06 sec)

トランザクションのオーバーヘッドにより、クエリが InnoDB テーブルに対してより長く実行されますか? または?

4

2 に答える 2

2

自動コミットされた INSERT ごとに考慮すべき 3 つの側面があります。

側面#1。オーバーヘッド

InnoDB は、ACID 準拠のストレージ エンジンとして MVCC とトランザクション分離をサポートしています。これに対応するために、変更がコミットされる前の行のコピーが System Tablespace ファイルの Undo Tablespace セクションに書き込まれますibdata1。INSERT を実行している場合、何が書かれますか? 空白行のコピー。そうすれば、ロールバックによって INSERT の試行が単純に削除されます。INSERT がコミットされると、元に戻すテーブルスペースの空白のコピーが消去されます。

側面#2。クラスタ化インデックス

すべての InnoDB テーブルには、と呼ばれる内部デフォルト行インデックスgen_clust_indexが存在します。これは、PRIMARY KEY の有無に関係なく作成されます。テーブルには id の PRIMARY KEY があるため、一意の id フィールドを含む行に関連付けられるように gen_clust_index が構築されます。

側面#3。構成

信じられないかもしれませんが、MySQL 4.1 のすぐに使える状態が MySQL 5.5 よりも高速な場合があります。衝撃的ですね。Percona は、実際に MySQL のいくつかのバージョンのベンチマークを行い、これが事実であることを発見しました。

以前DBA StackExchangeでこれについて書きました

于 2012-07-16T18:24:35.860 に答える
1

ここでは、CPU は要因ではありません。要因はディスクです。innodb では、コマンドは log に書き込む必要があるため、ログ ディスクが同じディスクであるか、ディスクがフラグメントではないか、ディスクが遅い場合は、大きな違いがあります。

于 2012-07-16T20:49:14.020 に答える