人に聞けない痔の悩み、これでスッキリ >>

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

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

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

宜しく御願いします。

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

A 回答 (2件)

 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です。
    • good
    • 0
この回答へのお礼

ありがとうございます。
以前に、MySQLを利用したプログラムを組んだことはあります。
DBをSQLiteから覚えたわけではありません。

MySQLは私のPCや、私の自宅サーバにも入れていますから、
インストールが然程難しくないことも知っています。

>型も文字列しかない?ないなど、本格的に使うには機能不足
それで構わないから、それを理解した上で、利用を考えています。
セキュリティーが無いことも、勿論承知しています。
今回は、それで十分なんです。

MySQLなどは、なんといってもインストールが必要であり、
ファイルサイズも、SQLite並には軽くありません。
ソフトウェアに、単体でバンドルできるシンプルさを求めて、
私は、SQLiteを選びました。

お礼日時:2008/09/11 10:40

実用的なdbとしてSQLiteは不向きと思いますが・・・



 パフォーマンス測定で10万件程度のデーターを Read/Write した事ありますが快適に使えましたよ。フィールドはID,商品名、価格の3個で、1レコード100(Byte)以下です。

PHPを使っているならPDOを利用してアプリを作成すると、開発はSQLite、実用アプリはMySQLというようにdbの切り替えが簡単にできます。
    • good
    • 0
この回答へのお礼

ありがとうございます。とても参考になりました。
フリーウェアで使用するデータベースのことなんですが、

どうしても、MySQLなどのデータベースの場合、インストールするか、
サーバーを用意するかが必要になってきますので・・・。
SQLiteの場合とてもシンプルに、EXEファイル単体だけで動作するという理由から
使用しようと考えていました。

お礼日時:2008/09/10 13:33

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

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

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリから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自体が処理を行っているので複数のクライアントからのリクエストが...続きを読む

QSQLite:項目が存在しない場合のみINSERT

SQLiteのテーブル内にunique属性を持つフィールドがあります。このフィールドと同名の内容を追加するとエラーが返りますが、SQLiteを呼び出すプログラム側で逐一そのエラーを例外処理しているため、プログラムとしては効率が悪いです。「(If not exist (...) insert ...のような)もしこの項目内容が存在しなければフィールドを追加する」という処理をSQLのクエリ文で完結させたいのですが、このようなことはできますでしょうか。

Aベストアンサー

field追加(alter table)じゃなくて、「行追加時に、uniqueカラムのデータがかち合ったら追加しない」でいいですか?
「制約競合解決アルゴリズム」を ON CONFLICT で指定します
conflict-algorithm ::=ROLLBACK | ABORT | FAIL | IGNORE | REPLACE
insert文では、ON CONFLICTの代わりに or で記述できます
INSERT OR IGNORE INTO table-name (column-list) VALUES(value-list)
参考
http://www.3rd-impact.net/Document/SQLite/Translation/Current/lang_conflict.html

QSQLiteでINSERT OR UPDATE

SQLiteにはREPLACE文がありますが、これを使うと、例えばn,c1,c2,c3フィールドがあるデータsampleに対して「replace into sample (n,c2) values (1,1)」を実行すると、c1とc3はnull値になってしまいます。

一部のSQLデータベースで用意されている「INSERT OR UPDATE」のように、行が存在すれば対象のフィールドのみを書き換え(それ以外のフィールドの内容は維持)、存在しなければ行を追加する構文を作ることは可能でしょうか。

Aベストアンサー

SQLiteでは、insert or replace しかないけど select文からの入力とサブクエリは使えるから

replace into [table_name] (n,c1,c2,c3)
select x.n, org.c1, x.c2, org.c3
from (select 1 as n, 1 as c2 ) as x
left join [table_name] as org on x.n=org.n ;

n がprimary key または uniqueの前提で1行書き換えまたは、新規挿入。

QSQliteの日付検索について

SQliteの日付検索について教えてください。
現在、SQLiteでデータベースを作成しています。
日付で範囲を選択してデーターを抽出したいのですが、方法がよく分かりません。
(例:2011-08-20から2011-08-27までの日にち分のデータを抜き出したい)
どなたか教えてください。
ちなみにデータベースにはDATE型でdateのcolumに”2011-08-20”という風に保存してあります。

Aベストアンサー

SELECT * FROM テーブル名 WHERE date >= '2011-08-20' AND date <= '2011-08-27'
SELECT * FROM テーブル名 WHERE date BETWEEN '2011-08-20' AND '2011-08-27'

とかでどうでしょうか。


SQLite はDATE型で定義しても、実体は文字列(TEXT型)に
なっているのだと以前聞いたことがあります。

Qpingでポートの指定

pingでIPアドレスを指定して、通信できるかどうかというのは
よく使いますが、pingでポートを指定して応答するかどうかは調べられるのでしょうか?

よろしくお願いします

Aベストアンサー

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含むICMP)ではできません。

FTPの疎通確認であれば、クライアントからサーバに対するTCP/21通信(FTP-CMD)が可能であること(サーバからクライアントへのTCP/21からの応答を含む)+サーバからクライアントに対するTCP/20通信(FTP-DATA)が可能であること(クライアントからサーバへのTCP/21からの応答を含む)が必要でしょう。

監視ソフトによるものであれば、
・クライアントからサーバへのログイン(TCP/21)
・クライアントからサーバへのlsの結果(TCP/20)
で確認すればよいでしょう。

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含む...続きを読む

QPC用OSとサーバー用OSの違いを教えて下さい

技術的な質問ではないのでこちらにて質問いたします。
とりあえずWindowsに絞って。
クライアントとサーバーの違いはわかるのですが、
そもそもPC向けのOS「Windows(Vista,Xp等)」と
サーバー向けのOS「Windows Server(2003等)」とは、
根本的に何が違うのでしょうか?

Aベストアンサー

基本的に用途が違うものなので全く別物といえますが、サーバー用OSを選択する理由として、データ共有を多くのクライアントPCで利用したい場合があります。
一般的なPC用OSの場合、データ共有の設定をしても同時のアクセスできる台数に制限があります。XP HOME では5台、XP Pro では10台が同時アクセスする上限になります。これは単に台数ではなくセッション数ですので、1台でも同時に複数のデータをにアクセスしていたりすると、1台で2セッション以上利用していることもあります。従ってネットワーク上にこの上限を超えるパソコンがあり、サーバ機にアクセスしようとすると単なるPC用のWindowsではアクセスが拒絶される場合があります。こうした状況の中ではすべてのパソコンでデータ共有が必ずしも常に利用できる状況にないので、10台以上のクライアントがある環境ではサーバーOSを導入したサーバー機に、共有データを保存しておいた方が問題は少ないです。
そのほかアクティブディレクトリなど、ユーザ管理をサーバで一元管理できる点など、一般的なPC用OSと比べて便利な機能もたくさんあります。
サーバーOS(WindowsServer2003等)は接続クライアント数を必要に応じて追加することができます(1クライアントあたり5,000円くらいのライセンス料がかかりますが)。サーバー用OSは利用できるクライアント数によって値段が違います。

基本的に用途が違うものなので全く別物といえますが、サーバー用OSを選択する理由として、データ共有を多くのクライアントPCで利用したい場合があります。
一般的なPC用OSの場合、データ共有の設定をしても同時のアクセスできる台数に制限があります。XP HOME では5台、XP Pro では10台が同時アクセスする上限になります。これは単に台数ではなくセッション数ですので、1台でも同時に複数のデータをにアクセスしていたりすると、1台で2セッション以上利用していることもあります。従ってネットワーク上にこの上限...続きを読む

QsqliteはExcelと連携できますか?

昨日からphpでsqliteを始めたのですが、わからないことだらけなので教えてください。
・sqliteはExcelでデータベースを連携できるのでしょうか?
・もしくは簡単にデータを加工できるフリーソフトなどありますか?

Aベストアンサー

私の場合、Excel2003+SQLite2で連携しています

「SQLite ODBC Driver」を使って接続しています
URLは以下です。sqliteodbc-0.69.exeを使用しています

http://www.ch-werner.de/sqliteodbc/

便利な点はファイルを直接指定して接続できる点です
(ODBCデータソースの設定なしに)
※ちなみにWebアプリではPHP4,Perlで使用しています

Sub s_レコードを出力する()
'
' クライアント検索
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset

'Excelファイルと同じディレクトリにSQLiteのファイル「sample.db」がある場合

cnt = "Driver=SQLite3 ODBC Driver; Database=" & _
ThisWorkbook.Path & "\sample.db" '**** SQLite3.x
'cnt = "Driver=SQLite ODBC Driver; " '**** SQLite2.xの場合

'SQL文
sql = "SELECT * from TableName "

rs.Open sql, cnt

'該当件がない場合は終了
If rs.EOF Then GoTo last

'該当レコードをシートに出力
rs.Movefirst

i = 1

Do Until rs.EOF = True
Worksheets("結果出力").Cells( i, 1) = rs.Fields(0).Value
Worksheets("結果出力").Cells( i, 2) = rs.Fields(1).Value
rs.MoveNext
i = i + 1
Loop

MsgBox "該当件数:" & i - 1 & "件"

last:

'オブジェクトの破棄
rs.Close
Set rs = Nothing

End Sub

私の場合、Excel2003+SQLite2で連携しています

「SQLite ODBC Driver」を使って接続しています
URLは以下です。sqliteodbc-0.69.exeを使用しています

http://www.ch-werner.de/sqliteodbc/

便利な点はファイルを直接指定して接続できる点です
(ODBCデータソースの設定なしに)
※ちなみにWebアプリではPHP4,Perlで使用しています

Sub s_レコードを出力する()
'
' クライアント検索
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset

'Excelファイルと同じディレクトリにS...続きを読む

Qエクセル関数で日付かどうかの確認?

ワークシート関数でセル内が日付かどうか調べるものはないでしょうか?
VBAのIsDateなら存じておりますが。

Aベストアンサー

日付を表すデータは、セルの値としては、単なる数値なのですが、どういう種類のセルの書式が設定されているかを調べることはできます。
調べたいセルがA1だとして
=cell("format",A1)

"D1"になれば概ね日付だと判別できます。
時刻を含めたものにする場合は、
Dで始まることをチェックすればいいかも。
詳しくは、CELL関数のヘルプを参照してください。

QMySQLで保存できる限界行数

例からなんですが、インターネットの掲示板のデータベースとかでMySQL等を使って保存するやり方があると思います。
 しかし、書き込み内容などが増えれば当然保存する量が増えて重くなったりすると思うのですが、mixiや2chなどの大規模なサイトになってくると書き込み内容の量が相当なものになりデータベースの行数も相当なものになると思うのですが、これらのサイトはどういう風にして膨大な書き込み内容などを管理しているのでしょうか?またMySQLはどのくらいの行数までが軽快な動作を保てるのでしょうか?
データベースはSQL文一つでデータの検索やソートなどができるし今後も使い続けたいものなので教えてもらえると幸いです。

Aベストアンサー

理論的にはディスク容量が許す限り記録可能だと思います。
しかしトラフィックには限界があるわけなので下記のリンクにあるように分散処理するのが一般的でしょうね。
どのくらいで快適に動作するかは環境によって違いますので一概には言えません。

参考URL:http://techtarget.itmedia.co.jp/tt/news/0709/12/news01.html

QSqliteで使えない文字。

Sqlite3にて

列名やデータ内で使えない文字列(記号等の文字コード)を教えてください。

調べてみた情報では
改行や区切り文字などの基本的なことしか見つかりませんでしが

実際に使っていると、半角スペース等が混入している場合
全てではありませんが、データベース内で明らかに存在するのに検索できないなどの場合
があるようです。

一つずつ調べてエスケープ処理をすることは現実的に不可能なので
独自にエスケープ処理等を書かれている方に

どのような文字列をエスケープしていますでしょうか?

Aベストアンサー

「なでしこ」ですか、、、プリペアドステートメント-プレースホルダーにも対応していないのかな?

>データベース内で明らかに存在するのに検索できない
エスケープ処理よりも、文字コードの問題が大きいような気がします。
SQLiteは、SQL文内の文字列として解釈できれば、基本どんなバイナリーデータもそのまま受け入れてしまうのですけど、検索やソートの時に、sjis やeucでは、バイト列がずれてマッチしたりしてうまくいきません。
SQLite3 なら、utf-8には対応してるので、utf-8でなら概ねうまく検索されます。
「なでしこ」でどの文字コードが使われているのか解りませんが、utf-8で保存し、検索時のデータ指定もutf-8でSQL文を構築、取り出し後、表示用の文字コードに変換という手順が必要です。

エスケープ処理について、phpマニュアルでの、sqlite_ecsape_string() 関数(SQLite2用)の説明によれば、文字列データのくくりは、シングルクオート(')の方を使うようにし、データ内のシングルクオート(')は2重にしてるようです。たしか標準SQL規格準拠の動作。
そのほかのバイナリー文字は、たぶん バックスラッシュ(\ 0x5c) を付加かな。
でも、SQLite3では、プリペアドステートメント推奨となっています。

「なでしこ」ですか、、、プリペアドステートメント-プレースホルダーにも対応していないのかな?

>データベース内で明らかに存在するのに検索できない
エスケープ処理よりも、文字コードの問題が大きいような気がします。
SQLiteは、SQL文内の文字列として解釈できれば、基本どんなバイナリーデータもそのまま受け入れてしまうのですけど、検索やソートの時に、sjis やeucでは、バイト列がずれてマッチしたりしてうまくいきません。
SQLite3 なら、utf-8には対応してるので、utf-8でなら概ねうまく検索されます...続きを読む


人気Q&Aランキング