MySQL vs PostgreSQL ベンチマーク対決の続き。
MySQL でトランザクションをサポートする InnoDB を組み込んで ( --with-innodb )、SRPM からリビルドしたもので再実験。
gcc-2.96 でコンパイルしちゃだめよ、とダウンロードページでも警告されている
ので、コンパイラには gcc-2.95-3 (/usr/bin/gcc_2_95_3) を使用。
ベンチマークスクリプトは これ。 Perl + DBI + DBD::(mysql | Pg)
で計測する。
テーブルは「英辞郎」の、892,200語が入った
CREATE TABLE eijiro (word text, trans text);
このような単純なもの。word カラムにはインデックスを設定。
$ perl bench.pl
mysql(connect 0.03092) MyISAM
'create %' 0.00771 (select:fetch=0.00480:0.00291) 198 rows
'table a%' 0.00830 (select:fetch=0.00800:0.00030) 5 rows
'%text%' 2.75875 (select:fetch=2.75073:0.00802) 612 rows
'%integer%' 2.75166 (select:fetch=2.75120:0.00046) 16 rows
mysql(connect 0.00139) MyISAM (sorted)
'create %' 0.01085 (select:fetch=0.00798:0.00287) 198 rows
'table a%' 0.00266 (select:fetch=0.00235:0.00031) 5 rows
'%text%' 3.19451 (select:fetch=3.18637:0.00814) 612 rows
'%integer%' 3.17291 (select:fetch=3.17246:0.00045) 16 rows
mysql(connect 0.00139) InnoDB
'create %' 0.01823 (select:fetch=0.01534:0.00289) 198 rows
'table a%' 0.00402 (select:fetch=0.00371:0.00031) 5 rows
'%text%' 8.31590 (select:fetch=8.30760:0.00830) 612 rows
'%integer%' 8.30163 (select:fetch=8.30118:0.00045) 16 rows
mysql(connect 0.00141) InnoDB (sorted)
'create %' 0.02415 (select:fetch=0.02141:0.00274) 198 rows
'table a%' 0.01066 (select:fetch=0.01036:0.00030) 5 rows
'%text%' 23.06711 (select:fetch=23.05917:0.00794) 612 rows
'%integer%' 23.53014 (select:fetch=23.52968:0.00046) 16 rows
Pg(connect 0.07262)
'create %' 0.02140 (select:fetch=0.01822:0.00318) 195 rows
'table a%' 0.00200 (select:fetch=0.00170:0.00030) 5 rows
'%text%' 4.02334 (select:fetch=4.01500:0.00834) 573 rows
'%integer%' 4.03201 (select:fetch=4.03154:0.00047) 16 rows
Pg(connect 0.01641) (sorted)
'create %' 0.02060 (select:fetch=0.01762:0.00298) 195 rows
'table a%' 0.00220 (select:fetch=0.00190:0.00030) 5 rows
'%text%' 4.03156 (select:fetch=4.02310:0.00846) 573 rows
'%integer%' 4.04510 (select:fetch=4.04463:0.00047) 16 rows
発行された SQL は、
SELECT * FROM eijiro WHERE word LIKE ? [ ORDER BY word ];
? が検索語句。
結果の見方は以下のとおり。
- XXXX(connect YYYY)
- XXXX のドライバ (mysql=MySQL, Pg=PostgreSQL) で、connect するのに YYYY 秒
- 'WWWWW' TTTTT (select:fetch=SSSSS:FFFFF) RRR rows
- WHERE 句の LIKE の条件が WWWWW 、SELECT して fetch するのに合計 TTTTT 秒。
そのうち、SELECT (execute メソッドが完了するまで) に SSSSS 秒、
fetch (データを配列にコピーするだけ) に FFFFF 秒。
SELECT された行数は RRR 行。
MySQL と PostgreSQL で行数が違うのは、MySQL は大文字小文字を無視してマッチ、PostgreSQL は大文字小文字を区別してマッチ、という仕様のため。
- (sorted)
- ORDER BY word を指定した場合。
一応、同じベンチマークを数回繰り返したので、例によってデータベース自体はファイルキャッシュに乗っかってる状態。大体の傾向として、
- connect は MySQL が速い。PostgreSQL は 1クライアント/1サーバプロセス だが、MySQL はスレッドで処理するので、その違いか?
- インデックスが使われる SELECT では MyISAM > InnoDB =~ PostgreSQL
90万レコードあっても、実用上問題になるほどの違いはない。
- インデックスが使われない(ベタサーチ) SELECT では
MyISAM > PostgreSQL > InnoDB
- InnoDB はベタサーチが遅い。更に sort すると劇的に遅い。
- PostgreSQL はソートしてもしなくても、パフォーマンスに違いがでない < VACUUM 直後だからか?
環境は以下のとおり。