マイコミジャーナル

知りたい!を刺激する総合専門サイト


  1. エンタープライズ

  2. 特集
  3. 生まれ変わるPHP - Zend Engine 2、SQLiteの実力は?

【特集】

生まれ変わるPHP - Zend Engine 2、SQLiteの実力は?

8 MySQLとSQLiteの比較 - 大量のデータの書込みでは?

2004/03/29

鶴田展之

さて、データベースが作成できたのでPHPからMySQL、SQLiteそれぞれのデータベースを操作してみよう。まず、大量データの挿入を行った場合、どちらが速いだろう。以下のようなスクリプトを書いて検証してみる。

MySQL用

<?php
function getmicrotime(){
list($usec, $sec) = explode(" ",microtime());
return ((float)$sec + (float)$usec);
}

$lines = 1000;
$con = mysql_connect("localhost", "root", "");
mysql_select_db("phptest");

$start = getmicrotime();
for ($i=0; $i<$lines; $i++) {
$sql = sprintf("insert into t1 values(%d);", $i);
mysql_query($sql, $con);
}
$elapsed = getmicrotime() - $start;
printf("%d件の挿入に%f秒かかりました。",$lines, $elapsed);
mysql_close($con);
?>

SQLite用
<?php
function getmicrotime(){
list($usec, $sec) = explode(" ",microtime());
return ((float)$sec + (float)$usec);
}

$lines = 1000;
$con = sqlite_open("/tmp/phptest");

$start = getmicrotime();
for ($i=0; $i<$lines; $i++) {
$sql = sprintf("insert into t1 values(%d);", $i);
sqlite_query($sql, $con);
}
$elapsed = getmicrotime() - $start;
printf("%d件の挿入に%f秒かかりました。",$lines, $elapsed);
sqlite_close($con);
?>

このスクリプトは、両者とも全く同じく1000件のデータを連続して挿入する。実行結果は、予想外に圧倒的な大差がついた。

SQLite

1000件の挿入に16.398893秒かかりました。

MySQL

1000件の挿入に0.424522秒かかりました。

さすがはMySQLといったところだが、SQLiteの16秒はちょっとかかりすぎだろう。どうやら大量データの連続挿入はSQLiteの不得意な処理のようだ。

お詫びと訂正

SQLiteでは明示的にトランザクションを開始しない限り、INSERT処理の前後に必ず"BEGIN"、"COMMIT"が実行される。後日追試を行ったところ、MySQLに対して大幅に処理時間がかかったのはこのためであることがわかった。試しに、次のように繰り返し処理を1つのトランザクション内に置いてみたところ、1000件の挿入もMySQLを上回る0.221312秒で完了した。

sqlite_query($con, "begin;");
$start = getmicrotime();
for ($i=$j+1; $i<$lines; $i++) {
        $sql = sprintf("insert into t1 values(%d);", $i);
        sqlite_query($con, $sql);
}
$elapsed = getmicrotime() - $start;
sqlite_query($con, "commit;");

以上、情報をお寄せ頂いた皆様にお礼申し上げると共に、お詫びして訂正させて頂きたい。


特別企画


注目サイト