SQLite

SQLite の INSERT は遅いのか?

MySQLとSQLite(PrinCo.)という記事経由で、生まれ変わるPHP - Zend Engine 2、SQLiteの実力は?(MYCOM PC WEB)という記事を読んだ。 MySQL と SQLite で INSERT 時の処理速度が公開されている。 1000件のレコードのINSERTを実行し、それぞれにどれぐらいの時間がかかっているかを示しているのだ。 MySQLが 0.4秒、SQLite が 16秒だというのだが、これはあまりにもひどすぎる。しかも、結論としてどうやら大量データの連続挿入はSQLiteの不得意な処理のようだ。と書かれている。1000件程度でこんなにかかるんだったら、10000件だったら160秒ぐらいかかる(単純すぎ。)って事? 実はこれにはからくりがあって、SQLite の処理は トランザクション の中でないと著しく遅いのだ。おそらく、これが原因なのではないかと思っている。

SQLite での ロック

あるプロセスが データを書き換え中に、他のプロセスが書き換えできないようになっているようだ。

仕組みとしては、トランザクション中に、他のプロセスがトランザクションを開始しようとすると、SQLITE_BUSY ってのが返ってくる。 API の sqlite_busy_timeout() を使って、SQLITE_BUSY になるまでの時間をミリ秒で指定できる。

トランザクションの開始だけでなく、DELETE, INSERT, UPDATEなども出来ないようになっている。

SQLite での SEQUENCE

FAQ : How do I create an AUTOINCREMENT field. で説明されているように、フィールドを INTEGER PRIMARY KEYで定義しておき、INSERT でそのフィールドに null値を代入すると、自動的に SEQUENCE 値が代入される。

あと、SEQUENCE値として代入された数値を取り出す場合は、API sqlite_last_insert_rowid() を使用する。