SQLite のメリットとデメリットってこんな感じ?
今さらですが、SQLite という RDBMS に興味がわいたので、少しづつ調べています。
もともとは組み込み用の RDBMS だったらしいのですが、PHP5 に採用されて「Webのバックエンドとしてもイケるじゃん!」ってことになったみたいです。
ライセンスがパブリックドメインっていうのも、使う側からすれば気が楽ですしね。
と言うわけで、SQLite のメリット、デメリットについてメモしておこうと思います。まだ調査段階での感想ですので、間違ってたらごめんなさい。
- 1つのファイルが1つのDBなので、バックアップ&データコピーが楽(ファイルのコピーでOK)。
- トランザクションが利用できる。
- トリガーが利用できる。
- ビューが利用できる。
- 動作が速い(要トランザクション使用)。
- コピーしたDBファイルは他のOS上でも利用可能。
- ロックがDBレベルなので、デッドロックは起きない。
- データの型が少ない。
- (基本的に)外部のクライアントからはアクセスできない。
- アクセス数分プロセスが立ち上がるので、高負荷なシステムには向かない(?)。
- トランザクション進行中はDBレベルでロックがかかる(ただしSELECTはできる)。
- 定期的に VACUUM が必要(?)。
- 負荷分散はできない。
- 利用できる文字コードは、UTF-8、UTF-16BE、 UTF-16-LE。
- ユーザー、スキーマという概念が無い。
と、こんな感じでしょうか?ファイルベースのRDBMSとしては、他にも Xbase(DBF) とか Access(MDB) とかあるわけですが、ライセンスの問題とか使える機能とか考えると、かなり有力な候補ですね。
ただ、MySQL とか PostgreSQL を利用できる環境があるのなら、あえて SQLite を選択するメリットがあるかどうか・・・。
レンタルサーバーでDBが1つしか使えなくて、どうしても別のDBにデータを入れたい!って時には役立つかもしれません(もちろん SQLite が利用できればですが)。
もしくは、1台のマシンでDBサーバーもWebサーバーもAPサーバーも・・・という条件だと、DBの子守りの手間が減って良いかも。
あとは、個人のPCでサクッと RDBMS を動かしたい時とかかなぁ(でも、僕のPCって MySQL が動いてるしなぁ)。
そんなわけで使ってはみたいのですが、どういうアプリ or シチュエーションで使うと威力を発揮してくれるのか思案のしどころです。でも、定期的に VACUUM しなくちゃいけないとなると、面倒だなぁ。
また、トランザクション進行中に、ファイルをコピーしようとするとどうなるかとか・・・。気になります。
参照リンク
・SQLite Home Page
・月に遊ぶ:SQLiteの使い方
・sqlite:SQLite データベースを管理するプログラム
・SQLite が認識できる SQL
各端末にSQLiteをいれて、サーバーデータの一時的な避難先。オフでも使えるシステムのために使おうかなと。以前から考えてたんだけど・・・
AirではSQLite対応らしいのでアプリケーション作りやすくなりました。
Posted by: MU | 01/12/2008 at 11:02
コメントありがとうございます。
なるほど。メインのDBは MySQL とか PostgreSQL とかを使って、バックアップ用に SQLite を使おうってことですね。
バックアップは負荷の少ない深夜にタイマーで実行すればいいし、万が一メインのDBがダウンしても接続先をローカルの SQLite に切り替えればとりあえず運用は続けられるわけですよね。
SQLite は DAEMON とか サービス を起動しておく必要がないから、普段の運用時はリソースを消費しないのもいいなぁ。
データ量にもよるだろうけど、バックアップ兼スタンバイDBってわけですね。
ナイスなご意見、ありがとうございました(こういう運用、ちょっと検討してみようかな)。
Posted by: 夢界 | 01/12/2008 at 17:16
SQLiteのデメリットの説明で、
> トランザクション進行中はDBレベルでロックがかかる(ただしSELECTはできる)。
とありますが、トランザクション中にSELECTを発行できますでしょうか?
アプリAからテーブルXに1万件のデータをトランザクション開始して登録中に、アプリBからテーブルY(レコード1件のみ)にSELECTしてみましたが、結果が返って来るのはアプリAの動作が完了してからの様に見受けられました。
なおSQLiteのバージョン情報は以下となります(.versionコマンドの結果)。
SQLite 3.25.3 2018-11-05 20:37:38 89e099fbe5e13c33e683bef07361231ca525b88f7907be7092058007b75036f2
zlib version 1.2.11
gcc-5.2.0
Posted by: あばば無人君 | 09/25/2019 at 09:45
コメントありがとうございます。
記事を書いた時は出来てたと思ってたんですけど・・・。
一応検証もしたハズなんですけど・・・。
また確認してみます。
Posted by: 夢界 | 09/29/2019 at 16:44
あばば無人君様
ご指摘の件について検証してみました。
検証手順は以下の通り
初期状態:テーブルAに1行のデータが登録されている
1.アプリA:トランザクション開始
2.アプリA:テーブルAに1行追加(ジャーナルファイルの作成を確認)
3.アプリA:テーブルAにselect発行。2行の応答を確認
4.アプリBを起動
5.アプリB:テーブルAにselect発行。1行の応答結果を確認
6.アプリA:コミット(ジャーナルファイルがなくなる事を確認)
7.アプリB:テーブルAにselect発行。2行の応答結果を確認
以上になります。
上記結果から、トランザクション中もselectは可能と判断しています。
なお OS は Windows10、アプリは tksqlite-0.5.13-win32-bin を
使用しました。
いただいたコメントでは1万行追加の最中に検証されたようですので、可能性としてはディスクアクセスの関係でアプリBの応答が遅れたのかもしれませんが、よくわかりません。
Posted by: 夢界 | 09/29/2019 at 17:58