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(カラム名無指定) を行ったものです。