SQLiteはどのようにスケーラブルですか?[閉まっている]


178

私は最近、SQLiteとMySQLに関するこの質問を読みましたが、SQLiteは適切にスケーリングされておらず、公式Webサイトがこれをある程度確認していると回答が指摘しました。

SQLiteのスケーラビリティとその上限はどのくらいですか?

回答:


429

昨日小さなサイトを公開しました*すべての訪問者の共有SQLiteデータベースを使用した担当者を追跡します。残念ながら、それが私のホストにかける適度な負荷があっても、それは非常にゆっくりと実行されました。これは、更新/挿入が含まれているため、ページが表示されるたびにデータベース全体がロックされていたためです。私はすぐにMySQLに切り替えましたが、テストする時間はあまりありませんでしたが、SQLiteよりはるかにスケーラブルなようです。SQLiteでシェルからクエリを実行しようとすると、ページの読み込みが遅く、データベースがロックされることがあるというエラーが発生することを覚えています。そうは言っても、私はSQLiteの別のサイトを問題なく実行しています。違いは、サイトは静的であり(つまり、データベースを変更できるのは私だけ)、そのため、同時読み取りでは問題なく機能します。この話の教訓:

編集:私はSQLiteに不公平だった可能性があることに気づきました-Webページからサービスを提供しているときにSQLiteデータベースの列にインデックスを付けませんでした。これが部分的に私が経験していた減速を引き起こしました。ただし、データベースロッキングスタンドの観察-特に面倒な更新がある場合、SQLiteのパフォーマンスはMySQLまたはPostgresと一致しません。

別の編集:これを約3か月前に投稿して以来、SQLiteのスケーラビリティを綿密に調査する機会があり、いくつかのトリックで非常にスケーラブルになりました。最初の編集で述べたように、データベースインデックスはクエリ時間を劇的に削減しますが、これはSQLiteよりもデータベースに関する一般的な観察の多くです。ただし、SQLiteを高速化するために使用できるもう1つのトリックとして、トランザクションがあります。複数のデータベース書き込みを行う必要がある場合は、トランザクション内に書き込みます。書き込みクエリが発行されるたびにファイルに書き込み(およびロック)する代わりに、書き込みはトランザクションが完了したときに一度だけ行われます。

最初の段落でリリースしたと言ったサイトはSQLiteに戻りました。コードをいくつかの場所で調整すると、サイトは非常にスムーズに動作します。

*このサイトは利用できなくなりました


3
MySQLの「クラシック」データベースエンジンであるMyISAMには、同時読み取り/書き込み操作に関してSQLiteと同じ問題があります。実際、書き込み操作で触れるすべての行をロックするため、書き込み集中型のアプリケーションを拡張することは不可能です。それでも、多くのWebアプリケーションに問題なく機能しました。
ヘニング

1
それでは答えの初めを書き直していただけませんか?適切なインデックスがないDBのパフォーマンスを判断することは完全に不公平です。また、トランザクションはSQLiteのパフォーマンスとスケーラビリティを大きく変化させます。
Kornel

3
@porneL:そうですが、インデックスのないSQLiteはインデックスのないMySQLよりも桁違いに遅く、また、2回目の編集にはトランザクションについても少し含めました。私は今でも答えの進歩には意味があると思います-SQLiteの最初の素朴な使い方とパフォーマンスがどれほど悪かったかを示しています。プラットフォームの初心者でも同様の問題が発生することを期待しています。最初の段落で特定してから、次の編集を読んで、SQLiteを高速化して許容できるパフォーマンスを実現する方法があることを理解したいと思います。
カイルクローニン

1
サイトの1秒あたりのヒット数をおおよそ教えてください。
NoobOverflow 2012

2
新しいSQLiteバージョンで利用可能な先読みログ(WAL)もあり、読み取り/書き込みサイクルの痛みの一部を取り除くことができます。状況は変わります。
Lasse V. Karlsen 2014年

58

Sqliteはシングルユーザーの観点からスケーラブルであり、私は非常にうまく機能するマルチギガバイトのデータベースを持っていて、それに関して多くの問題を抱えていませんでした。

しかし、それシングルユーザーなので、あなたが話しているスケーリングの種類に依存します。

コメントに応じて。マルチユーザー環境でSqliteデータベースの使用を妨げるものはありませんが、すべてのトランザクション(事実上、データベースを変更するすべてのSQLステートメント)がファイルをロックするため、他のユーザーがデータベースアクセスできなくなりますすべて

そのため、データベースに多くの変更を加えた場合、基本的にスケーリングの問題に非常に早くぶつかることになります。一方、書き込みアクセスに比べて読み取りアクセスが多い場合は、それほど悪くはないかもしれません。

しかし、SQLiteはもちろんの意志機能マルチユーザー環境では、それはないでしょう実行も。


5
SQLite 3は、他​​のユーザーが書き込みを行っているときの読み取りをサポートしています。
Alix Axel、

2
上記のコメントは古くなっていることに注意してください。新しいWALシステムでは、書き込みと読み取りを同時に実行できるため、スケーラビリティが向上します。
Lasse V. Karlsen、2015

SQLサーバーやOracleなどの任意のRDBMSからsqliteにその場でレコードをエクスポートして作成することは可能ですか?
ILoveStackoverflow 2018

29

SQLiteは、sqlite.orgのWebサイトなど、トラフィックの多いサイトを駆動します。彼らはあなたが持っていることを示唆している場合未満100kの一日あたりのヒットを、SQLiteのは、罰金を動作するはずです。そして、それは「先行書き込みロギング」機能を提供する前に書かれました。

SQLiteでスピードアップしたい場合は、次のようにします。

  • SQLite 3.7.xにアップグレード
  • 先行書き込みログを有効にする
  • 次のプラグマを実行します: "PRAGMA cache_size = Number-of-pages;" デフォルトのサイズ(ページ数)は2000ページですが、その数を増やすと、メモリが不足しているデータ量が増えます。

先読みロギングの使用方法を示し、書き込み速度が5倍向上することを示す、YouTubeで「先読みロギングによるSQLiteのパフォーマンスを向上させる」という私のビデオをご覧ください。


24

Sqliteはデスクトップまたはインプロセスデータベースです。SQL Server、MySQL、Oracle、およびそれらの兄弟はサーバーです。

デスクトップデータベースは、その性質上のための良い選択ではありません任意のデータストアへの同時書き込みアクセスをサポートする必要があるアプリケーション。これには、これまでに作成されたほとんどのWebサイトがある程度含まれます。なんらかの理由でログインする必要がある場合でも、おそらくDBへの書き込みアクセスが必要です。


5
「これにはこれまでに作成されたほとんどすべてのWebサイトが含まれます」には同意しません。コメント。ウェブサイトの負荷が高い場合は正しいです。たとえばTracはデフォルトでSQLiteを使用しており、小規模なチームの場合はすぐに使用できます。
Andrew Burns

2
時間をかけてください。2人の開発者が同じフィールドに同時にアクセスし、窒息するでしょう。
Joel Coehoorn、2008

3
チョークとは何ですか?あなたの回答から、SQLiteの経験があまりないと思います。SQLiteは操作時にファイル全体をロックするため、遅延が発生する可能性がありますが、提案した状況で「チョーク」させることはほぼ不可能です。
Andrew Burns

3
Andrewは、SQL Liteは小規模なチームに適しているため、スケーラブルにすることはできません。スケーラブルにすると、要件はスケーラブルになります。つまり、大規模なチームでも適切に機能するはずです。私の知る限りでは、SQL Liteは、かなり低いしきい値を超える大規模なチーム/同時データベース操作には拡張できません。
Pop Catalin

5
@正義。この答えは、SQLiteがいかにスケーラブルであるかを裏付ける証拠はありません。誰の答えもはるかに優れています。
GateKiller 2009年

23

このSQLiteドキュメント-http : //www.sqlite.org/whentouse.htmlを読みましたか?

SQLiteは通常、低から中程度のトラフィックのWebサイト(つまり、すべてのWebサイトの99.9%)のデータベースエンジンとして適切に機能します。SQLiteが処理できるWebトラフィックの量は、もちろん、Webサイトがデータベースをどれだけ頻繁に使用しているかによって異なります。一般的に言って、1日あたりのヒット数が10万未満のサイトはSQLiteで正常に動作するはずです。10万ヒット/日の数値は控えめな見積もりであり、ハードな上限ではありません。SQLiteは、その10倍のトラフィック量で動作することが実証されています。


3
私はこれに非常に同意します。Webサイトの99%は、必要に応じてSQLLiteで問題なく処理できます。一方、Webトラフィックの99%は最大の1%のWebサイトに送られます。
djangofan 2009

7
「10万ヒット/日」という指標はまったくのごみです。「ヒット」は通常、HTTP GETとして定義され、スライスされた画像の束を含むWebサイトは、ページビューごとに40以上の「ヒット」を取得する可能性があります。ドキュメントがhit == pageviewの間違いを犯している場合でも、それはまだ誤解を招くものです。SQLiteは、書き込み時にDB全体をロックします。レコードを閲覧しているだけの人々の10万ページビューを大胆に提供する可能性がありますが、書き込み集中型のアプリケーション(eコマース、メッセージボードなど)でばらばらになります。
jamieb 2010年

10

SQLiteのスケーラビリティは、使用するデータとその形式に大きく依存します。私は、非常に長いテーブル(GPSレコード、1秒あたり1レコード)で、いくつかの厳しい経験をしました。経験から、SQLiteは段階的に速度が低下することがわかりました。これは、インデックスを保持している成長しているバイナリツリーの絶え間ない再調整が原因です(タイムスタンプ付きのインデックスでは、ツリーが大幅に再調整されることを知っているだけでなく、検索)。したがって、最終的には約1 GB(大体、私は知っています)で、私の場合、クエリが遅くなります。あなたの走行距離は異なります。

覚えておくべきことの1つは、自慢のすべてにもかかわらず、SQLiteはデータウェアハウジング用に作成されていないことです。SQLiteには推奨さないさまざまな用途があります。SQLiteの背後にいる立派な人々はそれを彼ら自身と言います:

SQLiteのもう1つの見方は次のとおりです。SQLiteはOracleを置き換えるようには設計されていません。fopen()を置き換えるように設計されています。

そしてこれは主要な議論につながります(量的ではなく申し訳ありませんが質的です)、SQLiteはすべての用途に適しているわけではありませんが、MySQLは理想的ではないにしても、さまざまな用途に対応できます。たとえば、MySQLに(SQLiteの代わりに)Firefox Cookieを保存させることもできますが、そのサービスを常に実行する必要があります。一方、MySQLの代わりにSQLiteでトランザクションWebサイトを実行することもできますが(多くの人がそうです)、多くのダウンタイムが予想されます。


1
データをシャーディングすることで、非常に大きなインデックス付きテーブルの問題を回避できます。SQLiteでは、テーブルを個別のデータベースファイルに分割し、それを使用ATTACH DATABASEしてすべてのテーブルで仮想データベース接続を作成することもできます(ただし、62データベースに制限されます)。
Alix Axel

3

クライアントへの通知を提供する(1番の)Webサーバーが、データベースへの単一の接続でバックエンドに表示されると思いませんか?

したがって、データベースには同時アクセスがないため、データベースは「シングルユーザーモード」で動作していると言えます。このような状況ではマルチユーザーアクセスについて議論しても意味がありません。そのため、SQLiteは他のサーバーベースのデータベースと同様に機能します。


1
Thx GateKiller、ただし「少量のWebサイト」を指定してください。

3

このように考えてください。SQL Liteは、誰かが使用するたびにロックされます(SQLiteは読み取り時にロックしません)。したがって、複数の同時ユーザーがいるWebページまたはアプリケーションを提供している場合、SQLLiteを使用して一度にアプリを使用できるのは1人だけです。つまり、スケーリングの問題があります。その1人用のアプリケーションが、何百ものタイトル、評価、情報、使用、再生、再生時間を保持するミュージックライブラリと言えば、SQL Liteは数百万とは言わないまでも数千のレコードを保持して美しくスケーリングします(ハードドライブは喜んで)

一方、MySQLは、世界中の人々が同時にMySQLを使用するサーバーアプリに適しています。ロックせず、かなり大きいです。したがって、あなたの音楽ライブラリMySqlは、たった1人しか見ることができないのでやりすぎです。ただし、これは何千ものライブラリが追加または更新される共有音楽ライブラリではありません。次に、MYSQLを使用します。

したがって理論的には、MySQLはSqlliteよりもスケーラビリティが高いため、複数のユーザーを処理できますが、シングルユーザーアプリには過剰です。


5
s /それを使用する/それに書き込む。sqliteは読み取り時にロックしません。
Gregg Lind

5
まあ、あなたの答えは簡単に誤解される可能性があります。SQLiteは書き込みリクエストのみをロックします。私たちはリレーショナル形式で50GBを超える医療データにSQLiteを使用しており、ブラウジングとクエリのために何百もの同時Webクライアントにサービスを提供しています。その読み取りパフォーマンスは、最近のMySQLより悪くなることはありません。
バークD.デミール、

3
MySQLのMyISAMは、SQLiteほど同時アクセスには適していません。MySQLはテーブルレベルのロックを頻繁に使用し、MyISAMのレイアウトが最適である場合を除いて、同時書き込みを行いません。InnoDB(データファイルを縮小しないなどの独自の問題がある)を使用しない限り、MySQLを使用する方がはるかに良いことはありません。
Kornel

1

SQLiteのWebサイト(参照した部分)は、さまざまなマルチユーザーの状況で使用できることを示しています。

かなり対応できると思います。私の経験では、それは常に非常に高速でした。もちろん、テーブルにインデックスを付ける必要があり、それに対してコーディングするときは、パラメータ化されたクエリなどを使用する必要があります。基本的に、パフォーマンスを向上させるためにデータベースで行うのと同じことです。


トランザクションを使用します。これはSQLiteにとって重要です。
Kornel

-1

SQLite上に構築されたデータベースサーバーであるREAL SQL Serverをチェックする価値があるかもしれません。


7
ほとんどのサイトがSQLLiteの制限に達し始めるのに十分なトラフィックを得られない場合、どのサイトも「REAL SQL Server」に299ドルを費やすことを正当化するとは思いません。
djangofan 2009
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.