私は最近、 SQLiteとMySQLに関するこの質問を読みましたが、SQLiteの拡張性が低く、公式Webサイトのようなものでこれを確認しているという回答がありました。
SQLiteはどの程度スケーラブルであり、その上限は何ですか?
私は最近、 SQLiteとMySQLに関するこの質問を読みましたが、SQLiteの拡張性が低く、公式Webサイトのようなものでこれを確認しているという回答がありました。
SQLiteはどの程度スケーラブルであり、その上限は何ですか?
昨日小さなサイトを公開しました*すべての訪問者に対して共有SQLiteデータベースを使用した担当者を追跡します。残念ながら、それが私のホストにかける適度な負荷があっても、それは非常にゆっくりと実行されました。これは、更新/挿入が含まれているため、誰かがページを表示するたびにデータベース全体がロックされていたためです。私はすぐにMySQLに切り替えました。テストする時間があまりありませんでしたが、SQLiteよりもはるかにスケーラブルなようです。sqliteでシェルからクエリを実行しようとすると、ページの読み込みが遅くなり、データベースロックエラーが発生することがあることを覚えています。そうは言っても、私はSQLiteから別のサイトをうまく運営しています。違いは、サイトが静的であるため(つまり、データベースを変更できるのは私だけです)、同時読み取りでは問題なく機能することです。この話の教訓:
編集:私はSQLiteに公平ではなかったかもしれないことに気づきました-私がWebページからそれを提供していたとき、私はSQLiteデータベースのどの列にもインデックスを付けませんでした。これは部分的に私が経験していた減速を引き起こしました。ただし、データベースロックスタンドの観察-特に厄介な更新がある場合、SQLiteのパフォーマンスはMySQLまたはPostgresと一致しません。
別の編集:これをほぼ3か月前に投稿して以来、SQLiteのスケーラビリティを綿密に調べる機会がありました。いくつかのトリックを使えば、かなりスケーラブルになります。最初の編集で述べたように、データベースインデックスはクエリ時間を劇的に短縮しますが、これはSQLiteよりもデータベースに関する一般的な見解です。ただし、SQLiteを高速化するために使用できる別のトリックがあります。トランザクションです。複数のデータベース書き込みを行う必要がある場合は常に、それらをトランザクション内に配置します。書き込みクエリが発行されるたびにファイルに書き込む(そしてロックする)代わりに、書き込みはトランザクションが完了したときに1回だけ行われます。
最初の段落でリリースしたサイトはSQLiteに戻されており、いくつかの場所でコードを調整すると、非常にスムーズに実行されます。
*サイトは利用できなくなりました
Sqlite は、シングルユーザーに関してはスケーラブルです。私はマルチギガバイトのデータベースを持っていますが、パフォーマンスは非常に良好で、あまり問題はありませんでした。
ただし、これはシングルユーザーであるため、話しているスケーリングの種類によって異なります。
コメントへの返信。マルチユーザー環境での Sqlite データベースの使用を妨げるものは何もありませんが、すべてのトランザクション (事実上、データベースを変更するすべての SQL ステートメント) がファイルをロックすることに注意してください。これにより、他のユーザーがデータベースにアクセスできなくなります。すべて。
したがって、データベースに多くの変更を加えた場合、基本的にスケーリングの問題が非常に迅速に発生します。一方、書き込みアクセスに比べて読み取りアクセスが多い場合は、それほど悪くはないかもしれません。
もちろん、Sqlite はマルチユーザー環境でも機能しますが、うまく機能しません。
SQLite は、トラフィックの多い sqlite.org Web サイトやその他の Web サイトを動かしています。1 日あたりのヒット数が 10万未満であれば、SQLite は問題なく動作するはずです。そして、それは「Writeahead Logging」機能を提供する前に書かれました。
SQLite で処理を高速化したい場合は、次のようにします。
" Improv SQLite Performance With Writeahead Logging "という YouTube のビデオをご覧になることをお勧めします。このビデオでは、先行書き込みログの使用方法を示し、書き込み速度が 5 倍向上したことを示しています。
Sqliteは、デスクトップまたはインプロセスデータベースです。SQL Server、MySQL、Oracle、およびそれらの兄弟はサーバーです。
デスクトップデータベースは、その性質上、データストアへの同時書き込みアクセスをサポートする必要のあるアプリケーションには適していません。これには、これまでに作成されたほとんどのWebサイトがある程度含まれます。何かのためにログインする必要がある場合でも、おそらくDBへの書き込みアクセスが必要です。
この SQLite ドキュメント ( http://www.sqlite.org/whentouse.html ) を読みましたか?
通常、SQLite は、低から中程度のトラフィックの Web サイト (つまり、すべての Web サイトの 99.9%) のデータベース エンジンとして最適に機能します。もちろん、SQLite が処理できる Web トラフィックの量は、Web サイトがデータベースをどれだけ頻繁に使用しているかによって異なります。一般的に言えば、1 日あたりのヒット数が 100K 未満のサイトであれば、SQLite で問題なく動作するはずです。1 日あたり 10 万ヒットという数値は控えめな見積もりであり、厳密な上限ではありません。SQLite は、その 10 倍の量のトラフィックで動作することが実証されています。
SQLite のスケーラビリティは、使用するデータとその形式に大きく依存します。非常に長いテーブル (GPS レコード、1 秒あたり 1 レコード) で苦労した経験があります。経験上、SQLite は段階的に速度が低下することが示されました。これは、部分的には、インデックスを保持する成長するバイナリ ツリーの定期的な再調整が原因です (タイムスタンプ付きインデックスを使用すると、ツリーが頻繁に再調整されることはわかっていますが、それはあなたにとって不可欠です)。検索します)。そのため、最終的に約 1GB になると (大まかに言えば、私の場合はクエリが遅くなります)。あなたの走行距離は異なります。
覚えておくべきことの 1 つは、すべての自慢にもかかわらず、SQLite はデータ ウェアハウジング用に作成されていないということです。SQLite には推奨されていないさまざまな用途があります。SQLite の背後にいる優れた人々は、次のように述べています。
SQLite のもう 1 つの見方は次のとおりです。SQLite は Oracle を置き換えるようには設計されていません。fopen() を置き換えるように設計されています。
そして、これは主な議論につながります (定量的ではなく、申し訳ありませんが、定性的ではありません)。たとえば、(SQLite の代わりに) MySQL に Firefox の Cookie を保存することもできますが、そのサービスを常に実行する必要があります。一方、MySQL の代わりに (多くの人がそうしているように) SQLite でトランザクション Web サイトを実行することもできますが、多くのダウンタイムが予想されます。
このように考えてください。SQL Lite は、誰かが使用するたびにロックされます (SQLite は読み取りをロックしません)。そのため、複数の同時ユーザーがいる Web ページまたはアプリケーションを提供している場合、SQLLite を使用して一度に 1 人しかアプリを使用できません。したがって、スケーリングの問題があります。数百のタイトル、評価、情報、使用状況、再生、再生時間を保持する音楽ライブラリなどの 1 人用アプリケーションの場合、SQL Lite は美しくスケーリングされ、数百万とは言わないまでも数千のレコードを保持します (ハード ドライブが必要です)。
一方、MySQL は、世界中の人々が同時に使用するサーバー アプリに適しています。ロックがかからず、かなり大きいです。したがって、あなたの音楽ライブラリの場合、MySql は 1 人しか表示されないため、大量に追加または更新される共有音楽ライブラリである場合を除きます。次に、MYSQL を使用します。
したがって、理論的には、MySQL は Sqllite よりも優れたスケーリングを行うため、複数のユーザーを処理できますが、単一のユーザー アプリには過剰です。
何百ものクライアントにサービスを提供する (数字で 1 の) Web サーバーが、データベースへの単一接続でバックエンドに表示されると思いますね。
したがって、データベースには同時アクセスがないため、データベースは「シングル ユーザー モード」で動作していると言えます。このような状況でマルチユーザー アクセスについて議論するのは意味がないため、SQLite は他のサーバーベースのデータベースと同様に機能します。
SQLite の Web サイト (参照した部分) は、さまざまなマルチユーザーの状況で使用できることを示しています。
かなり対応できると言えます。私の経験では、常に非常に高速でした。もちろん、テーブルにインデックスを付ける必要があり、それに対してコーディングするときは、パラメーター化されたクエリなどを使用していることを確認する必要があります。基本的に、パフォーマンスを向上させるためにデータベースで行うのと同じことです。