スポンサーリンク

SQLite のメリットとデメリットってこんな感じ?

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対応らしいのでアプリケーション作りやすくなりました。

コメントありがとうございます。

なるほど。メインのDBは MySQL とか PostgreSQL とかを使って、バックアップ用に SQLite を使おうってことですね。
バックアップは負荷の少ない深夜にタイマーで実行すればいいし、万が一メインのDBがダウンしても接続先をローカルの SQLite に切り替えればとりあえず運用は続けられるわけですよね。
SQLite は DAEMON とか サービス を起動しておく必要がないから、普段の運用時はリソースを消費しないのもいいなぁ。
データ量にもよるだろうけど、バックアップ兼スタンバイDBってわけですね。

ナイスなご意見、ありがとうございました(こういう運用、ちょっと検討してみようかな)。

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

コメントありがとうございます。

記事を書いた時は出来てたと思ってたんですけど・・・。
一応検証もしたハズなんですけど・・・。

また確認してみます。

あばば無人君様

ご指摘の件について検証してみました。
検証手順は以下の通り

初期状態:テーブル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の応答が遅れたのかもしれませんが、よくわかりません。

Verify your Comment
Previewing your Comment

This is only a preview. Your comment has not yet been posted.

Working...
Your comment could not be posted. Error type:
Your comment has been posted. Post another comment

The letters and numbers you entered did not match the image. Please try again.

As a final step before posting your comment, enter the letters and numbers you see in the image below. This prevents automated programs from posting comments.

Having trouble reading this image? View an alternate.

Working...

コメントを投稿

プロフィール


  • 書いてる人:夢界 陸

    名古屋在住のおっさん。
    プログラミングやガジェットの話など、 日々の興味を徒然と綴っています。



    Twitterやってます @mukairiku

    運営サイト
    www.mukairiku.net

ブログ内検索

Licenses

  • Creative Commons License

OTHER

  • このブログのはてなブックマーク数

Blog powered by TypePad

スポンサーリンク