【特集】
さて、データベースが作成できたのでPHPからMySQL、SQLiteそれぞれのデータベースを操作してみよう。まず、大量データの挿入を行った場合、どちらが速いだろう。以下のようなスクリプトを書いて検証してみる。
MySQL用
$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
MySQL
さすがは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;");
以上、情報をお寄せ頂いた皆様にお礼申し上げると共に、お詫びして訂正させて頂きたい。
| iOS向けSPDYライブラリが登場、普及はじまるSPDY [11:57 2/9] |
| GitHubのアクティブプロジェクト、もっとも多いのはMITライセンス [11:42 2/9] |
| BIND 9系のすべてに重要度の高い脆弱性 [10:00 2/9] |
| Nginx強く成長、Webサーバとして確固たるポジションに - Netcraft [09:56 2/9] |
| Kubuntuへの資金提供を廃止 - Canonical [09:53 2/9] |
|
【レポート】CP+2012 - 話題の「OM-D」のタッチ&トライに長蛇の列 - オリンパス [17:45 2/9] 家電 |
|
Sprint、第4四半期決算を発表 - 米3大キャリアをiPhoneの販売コストが直撃 [17:41 2/9] 携帯 |
|
優れた住宅設計を選ぶ「第32回 INAXデザインコンテスト」の審査結果発表 [17:33 2/9] クリエイティブ |
|
【レビュー】強敵(とも)が待ち受ける過酷な戦場へ - 進化を遂げた『アーマード・コアV』の世界 [17:19 2/9] ホビー |
|
東大とマイクロソフト、障害児の大学受験を可能にするソフトを共同開発 [17:17 2/9] ビジネスPC |