sakaikの日々雑感~日常編

sakaikの日々の雑記。食べ物、読み物、お出かけ(旅行)などなど

INSERT@MySQL:カラム名を指定したほうが速いのか、指定しないほうが速いのか

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

その他

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

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