プロが教えるわが家の防犯対策術!

現在、SQLiteとPHPのキャッシュ(Cache_Liteなど)をともに使っているのですが、
どちらも使えそうな場合、どちらを使うか
迷いながら長い間使っています。

そこで、以下のような場合どちらを使うのがおすすめか
意見をお願いしたく思います。

SQLiteでいえば
ID content
1 比較的長い文章1..
2 比較的長い文章2..
3 比較的長い文章3..
.....

キャッシュ(ファイル)であれば
ファイル名:1 内容:比較的長い文章1..
ファイル名:2 内容:比較的長い文章2..
ファイル名:3 内容:比較的長い文章3..
.....

のようなものです。

SQLiteの場合、インデックスはIDにあり、検索時(SELECT時のWHEREなど)も
文章(content)の方で行うことはなく、IDでSELECTして取り出すのみです。

さらに、この
[比較的長い文章..]
は更新されたり、レコードorファイルごと削除される可能性があるとします。

このとき、データ数が数千数万~と膨大になるとき、
直近・将来的にどちらが遅くなる、あるいは不便になる(壊れるなど)
ことがありうるでしょうか。

なお、こういうものは「一般的にどっちの方が良いとはいえない、場合によるものだ」ということは重々承知しておりますが、その上で
おすすめや使い分けがありましたら、あるいは速度的な情報がありましたら、ぜひよろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

「PHPのキャッシュ」というのは知らないのですが、単純な入出力なら、RDBMSでなくOSレベルの入出力の方が単純だし、速いです。


RDBMSにするメリットは、SQLによる柔軟な操作であったり、SQLiteは該当しないのでしょうが排他制御や障害回復、機密保護などの機能が使えることです。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

>単純な入出力なら、RDBMSでなくOSレベルの入出力の方が単純だし、速い
>RDBMSにするメリットは、SQLによる柔軟な操作

なるほど、なんとなくそうではないかなと思っていたのですが、
chukenkenkou様のように詳しい方にアドバイスをいただけると、たいへん助けになります。ありがとうございます。

ORDERやWHERE、LIKEなどで検索・取り出し時の利便性が必要だったり、JOINだったり、複雑な(このくらいは単純な方だと思いますが)処理が必要なときにはSQLiteを使い、
上記質問文のような「単なるデータの保持」の場合はファイルによるキャッシュを利用していこうかとおもいます。


また、他に何か関連することなどでアドバイスがありましたら、
どなたでも、どんな些細なことでもかまいませんのでどうぞよろしくお願いします。

お礼日時:2008/11/14 21:09

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QSQLiteファイルへの同時アクセス過多によるロックについて

PHP5.0+SQLite2.8でユーザー投稿型のサイトを個人運営しています。
1日数万ページビューほどの規模で、
データベースのテーブルのレコード数は数万件、
1レコードあたりのカラム数は数十件ほどあり、
そのテーブルに1日数百件の投稿があります。
それらのデータは随時更新・削除・検索されます。

データベースファイルへのINSERT、UPDATE、DELETE、SELECTなどが重なると
「database is locked」とのエラーメッセージが表示され、
それからもずっとユーザーによるデータベースへのアクセスが続くため、
データベースへのアクセスがしづらい、
もしくはまったくできない状態が延々と続いてしまいます。

SQLiteではトランザクション中にファイル全体がロックされるため
こうした現象が発生するようですが、
この状態を元に戻す方法はないのでしょうか?
ファイルをいったん削除してアップロードしなおすと直るのですが、
ファイルのアップロードには時間がかかるため、
他にいい応急措置の方法がないものかと悩んでいます。

それから、そもそもこの規模のサイトでデータベースを運用するには
SQLiteでは限界があるのでしょうか?
仮に他のデータベースに乗り換えるとしたら、
こうした頻繁に書き込み・更新・削除などが行われるサイトでは
どのデータベースを利用すべきでしょうか?
それともこの程度の規模であれば、
スクリプトを改善することでSQLiteでも対応可能なレベルでしょうか?

なにぶんデータベースに触れて間もないもので知識不足ですが、
どなたか詳しい方にご教授いただければ幸いです。

PHP5.0+SQLite2.8でユーザー投稿型のサイトを個人運営しています。
1日数万ページビューほどの規模で、
データベースのテーブルのレコード数は数万件、
1レコードあたりのカラム数は数十件ほどあり、
そのテーブルに1日数百件の投稿があります。
それらのデータは随時更新・削除・検索されます。

データベースファイルへのINSERT、UPDATE、DELETE、SELECTなどが重なると
「database is locked」とのエラーメッセージが表示され、
それからもずっとユーザーによるデータベースへのアクセスが続くため、
...続きを読む

Aベストアンサー

そのような現象を確認したことがないので推測ですが・・・

たぶんSQLiteの限界と思います。
御自身で推測しているように「ファイル全体がロック・・・」は間違っていないと思います。 SQLiteの対極にあると思われるOracleが作業領域自体を複数のファイルで運用する理由のひとつが、このような現象を回避するためと推測できます。 SQLiteは、他のdbでは存在するdbエンジンと呼ばれるサービス( デーモン )が処理するのではなく、SQLite.exe自体が処理を行っているので複数のクライアントからのリクエストが重複した場合の処理が非力だと考えられます。

また、別の原因として考えられるのはWebサーバーのファイル・ロック機能との競合が考えられます。 これは私も経験している問題で、回避策はSQLiteからMySQLへのdb変更でした。 使用しているWebサーバーでは、SQLiteのロック以外に、単純にファイルがロックされる現象が、時々発生し、Webサーバーの管理者からはロック回避手段はないとの回答が来たのでSQLite -> MySQL 以外に選択の余地が無かったのですが、MySQLに変更して以来 db関連のロックされる現象は発生していないので SQLite の限界と理解しています( ファイルのロックは依然として時々発生しているので )。
ただ、別な回避策として、Webサーバーが管理していない領域にdbを設定する方法があるのですが、管理ツールの関係で移動できないので、本当に回避策なるかは確認していないです。

 なお、PHPでコーディングされているなら「PDO」でdbを操作していますか? もし、PDOで操作しているならdbへの接続文の1行を変更することでdbを変更できるので、開発はSQLite、実運用はMySQLという開発が可能なのでPDOによる記述をお勧めします。

そのような現象を確認したことがないので推測ですが・・・

たぶんSQLiteの限界と思います。
御自身で推測しているように「ファイル全体がロック・・・」は間違っていないと思います。 SQLiteの対極にあると思われるOracleが作業領域自体を複数のファイルで運用する理由のひとつが、このような現象を回避するためと推測できます。 SQLiteは、他のdbでは存在するdbエンジンと呼ばれるサービス( デーモン )が処理するのではなく、SQLite.exe自体が処理を行っているので複数のクライアントからのリクエストが...続きを読む

QSQLite3の許容される登録数は?

商品管理のプログラムを組んでいるのですが
データベースに「SQLite3」を使いたいと思っています。

SQLite3が、安定して動作できる、登録数(行数)はどれくらいでしょうか。
又は、これくらい登録したら、動作が不安定になった/遅くなったなどの情報でも構いません。

ちなみに、商品データベースといっても、商品名と、価格くらいしか記録しません。
ググってみたのですが、それらしい情報が無くて・・・。

宜しく御願いします。

Aベストアンサー

 dbの初心者さんかな?
 dbをSQLiteから覚えるのはちょっと危険ですね。

 SQLiteはユーザという概念もない超軽量dbで、ファイル1個をコピーすればバックアップが完了というお手軽です。しかし、それはdbを理解していて開発時にdb構築などの工程をできるだけ簡略化して本来のアプリケーション開発に専念してアプリケーションの完成度を高めたいという場合に有効と思います。
 SQLiteは、SQL的には他のdbとほぼ遜色ないレベルと思いますが、dbシステムという観点で比較すると、ユーザーという概念がないなどセキュリティーは貧弱というより、セキュリティーがないと考えて差し支えないと思います。 また、型も文字列しかない?ないなど、本格的に使うには機能不足の面は見逃しがたい点があります。

 PostgreSQL, MySQLもWindows版がリリースされているしインストーラーもあるのでインストールは比較的簡単です。 管理は、SQLite < MySQL < PostgreSQL < Oracle という感じで面倒になります。

 私はOracleから覚えたのでSQLiteは本当にSQLが使えるの? と思うほど軽いですが、用途を限定すればOracleと大きな差がないにも事実です。

 いちどWebで MySQLやPostgreSQLを調査した方が良いと思います。

 私の環境はタワー型のPCで、Apache, PHP, SQLite, MySQL をインストールしても快適に使えますが、たぶんノートPCでもMySQLでも問題ないと思います。



 最初の回答で忘れましたが・・・SQLiteに限りませんが、大量のデーターをINSERTする場合は、オート・コミットをoffにしないと非常に遅く( 10倍程度? )なるので必ずoffにしましょう。 ほとんどのdbでディフォルトはONです。

 dbの初心者さんかな?
 dbをSQLiteから覚えるのはちょっと危険ですね。

 SQLiteはユーザという概念もない超軽量dbで、ファイル1個をコピーすればバックアップが完了というお手軽です。しかし、それはdbを理解していて開発時にdb構築などの工程をできるだけ簡略化して本来のアプリケーション開発に専念してアプリケーションの完成度を高めたいという場合に有効と思います。
 SQLiteは、SQL的には他のdbとほぼ遜色ないレベルと思いますが、dbシステムという観点で比較すると、ユーザー...続きを読む

Q肥大化しすぎたSQLiteがVACUUMできません

MovableTypeをSQLiteで運営していましたが、投稿総数が3000以上となり、SQLITEの容量が160MBになってしまい、動画が不安定かつ、遅い、削除できないデータがある、再構築がもはや不可能という状態に陥ってしまいました。スパムコメントやログの削除、いらないデータの削除などがんばりましたが、調べてみるとSQLITEはVACUUMすると容量が減るとありました。

早速、VACUUMできるツールTkSQLiteでVACUUMを試みましたが、容量が大きすぎるのか、何度やってもエラーが帰ってきてスリム化できません。大事なサイトなのでなんとかしたいのですが、この肥大化しすぎたSQLITEのデータをスリム化する方法は他にありませんでしょうか?

Aベストアンサー

「xxできない」とか「エラーになる」とかでなく、具体的にどのようなエラーメッセージが出るとか事象を具体的に提示してください。
データ不整合やVACUUMができないなら、必要なデータを可能な限り救出して、データベースを再作成するしかないのでは?

.dump → .read でダンプしてリストアするといった方法があります。ただし、動画などbinaryデータを格納しているなら、selectでhex関数を使って16進数でファイル出力といった工夫をする必要があるかも知れません。

参考URL:http://www.sqlite.org/sqlite.html


人気Q&Aランキング