INSERT文にすべてのカラムの値を与える場合、カラム名を指定する書き方と指定しない書き方があります。

例:
  INSERT INTO table1 (col1, col2) VALUES ("AAA", "BBB");
  INSERT INTO table1 VALUES ("AAA", "BBB");

 これでINSERTの速度はどれくらい異なるのでしょうか。あるいは変わらないのでしょうか。気になったので測ってみました。

■MySQLバージョン
  mysql 5.0.51a on Linux (debian sarge / 2.6)
■主なパラメタ
  innodb_buffer_pool_size = 600M
  innodb_additional_mem_pool_size=20M
  innodb_log_buffer_size=10M
  innodb_log_file_size=40M
  key_buffer_size = 256M
  max_allowed_packet=64M
  innodb_flush_method=O_DSYNC
  innodb_data_file_path=ibdata1:1024M;ibdata2:1024M;ibdata3:1024M

■マシンスペック(今回もIMJモバイル様に環境をご提供いただきました)
  Xeon CPU 3060 @ 2.40GHz
  Memory 2.0GB

使用したテーブルおよびINSERT文例

 以下のテーブルを使用。

ai1: 
  CREATE TABLE ai1 ( id   int          NOT NULL, 
                       col1 varchar(128),
                       PRIMARY KEY (id) );
INS1:例:  INSERT INTO ai1 (id, col1) VALUES (4, 'HP0_Yfmyf');
INS2:例:  INSERT INTO ai1 VALUES (3, 'L342T7Tp0KNAYP7OXty1SPQuISHnk');

※INS1 はカラム名を指定、INS2 はカラム名を無指定。
※col1 の値は 6-100文字でランダムに生成させた文字列
※上記テーブルに、1万、2万、5万、10万、20万、30万、40万、50万件のINSERTを行った
※テーブルタイプは MyISAM, InnoDB それぞれに対して行った

結果

 MyISAM, InnoDB それぞれ以下のとおりとなった。1-1 は ai1テーブルに対してINS1(カラム名指定) を行ったもの、1-2 は同 INS2(カラム名無指定) を行ったものです。

■MyISAM

f:id:sakaik:20080930175422p:image:w480

■InnoDB

f:id:sakaik:20080930175423p:image:w480

感想とか

  • MyISAM, InnoDB とも、カラム名を指定しない INSERT文のほうが速い
    • 差は微々たるものなので単純に処理するサイズ(バイト数)がカラム指定のほうが大きいという部分での差が出たのかもしれない、とも思う。
    • 微々たる差だが、各件数結果で一貫しており、確実に「カラム無指定のほうが速い」と言えそう。
  • MyISAM と InnoDB では、今回の条件では一貫して InnoDB のほうが速い

その他

  • 今回まとめていろんなデータを取ったのですがごちゃごちゃしすぎてしまったので、見せ方に悩み中です
  • auto_increment カラムがある場合のINSERTは遅いのか? そんなデータをとってあります。 MyISAM/InnoDB で、カラム指定と半分指定と無指定と、組み合わせがちょっとややこしい。悩ましい。
  • 気になってきたので、やっぱりバイト数が近くなるようにカラム名を /* */でコメントアウトした状態での追試を後ほどしてみたいと思います。。

参考(以前のエントリー)

  • http://d.hatena.ne.jp/sakaik/20080909/mysql_index_sorted1
  • http://d.hatena.ne.jp/sakaik/20080909/mysql_index_sorted2
  • http://d.hatena.ne.jp/sakaik/20080909/mysql_index_sorted3
  • http://d.hatena.ne.jp/sakaik/20080910/mysql_index_sorted4