データベースではなくサーバーに(潜在的に)数千のディレクトリがあることの欠点?

StackOverflow https://stackoverflow.com/questions/1220965

質問

データをすべて大きなMySQLデータベースに保存するのではなく、プレーンテキストファイルを使用してサーバーにデータを保存しようとしています。問題は、数千のフォルダーと数十万のファイルを生成する可能性が高いことです(スケーリングが必要な場合)。 これを行う際の問題は何ですか?本当に遅くなりますか?データベースを使用するのとほぼ同じパフォーマンスですか?

意味: ブログのテーブルを保存するデータベースの代わりに、「author」、「message」を含む行があります。および「日付」代わりに: 特定の投稿のフォルダー、そのフォルダー内の* .txtファイル。" author"、" message"および「日付」それらに保存されます。

役に立ちましたか?

解決

これは、データベースよりも読み取りが非常に遅くなります(ファイルの書き込みはすべてほぼ同じ速度で行われます。書き込みをメモリに保存することはできません)。

データベースは最適化されており、大量の構造化データを処理するためのものです。ファイルシステムはそうではありません。ファイルシステムを使用してデータベースを複製しようとするのは間違いです。結局、データベースの列にインデックスを付けることができますが、別のツールなしでファイルシステムにインデックスを付けることは困難です。

データベースは、迅速なデータアクセスと取得のために構築されています。ファイルシステムは、データストレージ用に構築されています。ジョブに適したツールを使用します。この場合、それは絶対にデータベースです。

つまり、投稿用のHTMLファイルを作成し、それらのロケールをDBに保存して簡単にアクセスできるようにしたい場合、それは間違いなく優れたソリューションです(Movable Typeなど)。

しかし、これらをファイルシステムに保存している場合、どうやって最新の投稿を見つけることができますか?最も多作な著者ですか?最も物議を醸す著者?これらはすべてデータベースでは簡単であり、ファイルシステムでは非常に困難です。データベースに固執すると、喜んでやるでしょう。

他のヒント

それは本当に依存しています:

  • ファイルサイズとは
  • どのような耐久性要件がありますか?
  • 更新は何回行いますか?
  • ファイルシステムとは

MySQLの方が高速であることは明らかではありません:

small オブジェクトをのセッションストレージとして使用するために、このような比較を1回行いました。 CppCMS 。 1つのインデックス(キーのみ)と2つのインデックス(プライマリキーとセカンダリタイムアウト)。

File System:   XFS     ext3 
-----------------------------
Writes/s:      322     20,000

Data Base \  Indexes:    Key Only   Key+Timeout
-----------------------------------------------
Berkeley DB              34,400      1,450
Sqlite No Sync            4,600      3,400
Sqlite Delayed Commit    20,800     11,700

ご覧のとおり、単純なExt3ファイルシステムを使用すると、ACIDが得られないため(データの保存)、SQLite3と同じくらい速くなりました。

一方、DBはおそらく必要な多くの重要な機能を提供します。 本当に必要でない限り、ファイルをストレージとして使用することはお勧めしません。

DBは常にボトルネックではないことを忘れないでくださいシステムの

長々とした答えは忘れてください。プレーンテキストファイルにデータを保存するのが悪い考えである最も簡単な理由は次のとおりです。

  1. クエリを実行することはほぼ不可能です。ブログの投稿を日付でどのように並べ替えますか?すべてのファイルを読み取って日付を比較するか、独自のインデックスファイルを維持する必要があります(基本的に、独自のデータベースシステムを作成します)。

  2. バックアップするのは悪夢です。 tar cjf はカットしません。試してみると、一貫性のないスナップショットになる可能性があります。

    >

ファイルを使用しない理由はおそらく他にもたくさんあり、パフォーマンスを監視するのが難しく、デバッグするのが非常に難しく、エラーが発生した場合に回復するのがほぼ不可能で、ファイルを処理するツールがありません...

ここで重要なのは、データにインデックスを作成しないことです。 SOで検索を行うと、インデックス付きデータベースに比べて非常に遅くなります。また、IO操作は高価であり、データベースは(部分的に)メモリ内にある可能性があり、これによりデータがはるかに高速になります。

データベースを自分で使用しない理由を実際に言うことはありません...しかし、あなたが説明しているシナリオでは、いくつかの理由で、フォルダを介したDBを必ず使用します。まず、ブログのシナリオは非常にシンプルに思えますが、いつかは、検索、投稿の詳細、カテゴリなどの機能を追加してブログを拡張したいと想像するのは非常に簡単です。

モデルの成長は、DBよりもフォルダ構造で行うのが難しいと思います。

また、データベースは通常、インデックス作成とメモリキャッシュにより、ファイルアクセスよりもはるかに高速です。

IIRC Fudforumは、速度上の理由からファイルストレージを使用しました。DBインデックスを検索し、DBからデータを取得してユーザーに送信するよりも、ファイルを取得する方がはるかに高速です。ファイルシステムインターフェイスをDBおよびDBライブラリインターフェイスと交換しています。

ただし、だからと言って、高速化または低速化されるわけではありません。ファイルシステムでの書き込みは高速ですが、一般的な問題の場合はDBでの読み取りが高速になると思います。 fudforumのように、比較的不変のデータがあり、複数の投稿を1つにまとめて表示したい場合は、ファイルベースのアプローチの方がはるかに高速です。 1つのテキストファイルを1回表示します。そのような最適化を採用できれば、ファイルベースのアプローチが機能します。

また、メールサーバーはファイルベースのアプローチでも動作します。Maildir形式では、各電子メールメッセージがデータベースではなくディレクトリにファイルとして保存されます。

しかし、3つではなく1つのファイルにすべてを保存する方が良いでしょう。ファイルシステムは、複数のファイルよりも単一のファイルの読み取り(およびキャッシュ)の方が優れています。したがって、各メッセージを3つの部分として保存する場合は、それらをすべて1つのファイルに保存し、それを読み取って任意の部分を取得し、表示したい部分だけを表示します。

...そして、著者によるすべての投稿を検索したい場合、単純なSQLクエリの代わりに100万個のファイルを読むことができます...

データベースは高速ではありません。考えてみてください:最終的には、ファイルシステムにもデータを保存します。したがって、データベースが高速であるかどうかの質問は、アクセスパスに大きく依存します。

ファイル構造と相関するアクセスパスが1つしかない場合、ファイルシステムはデータベースよりもはるかに高速になる可能性があります。ファイルシステムで使用可能なキャッシュがあることを確認してください。

もちろん、データベースのすてきな機能をすべて失います: -トランザクション -データをインデックス化する柔軟な方法、したがって合理的に高速で柔軟な方法でデータにアクセスします。 -柔軟な((い)クエリ言語 -高い回復性。

スケーリングは実際に使用するファイルシステムに依存します。私の知る限り、ほとんどのファイルシステムには、ファイル数(全体またはディレクトリごと)に何らかの上限がありますが、新しいファイルシステムでは、これは非常に高いことがよくあります。ディレクトリを適切なサイズに保つためのディレクトリ構造を持つ数百および数千のファイルの場合、パフォーマンスの高いファイルシステムを見つけることができるはずです。

@Ericのコメント: 必要なものに依存します。クエリごとに正確なon fileのコンテンツのみが必要で、決定的な方法でファイルの場所と名前を決定できる場合、直接アクセスはデータベースが行うよりも高速です。

  • 多数のインデックスエントリにアクセスして、
  • テーブル行の束にアクセスします(rdbmsは通常、複数の行を含むブロックを読み取ります)
  • ブロックから単一の行を選択します。

見てみると、メモリにインデックスと追加の行があるため、キャッシュが非効率になりますが、dbの高速化はどこから来るのでしょうか?

データベースは一般的な場合に最適です。しかし、特別なケースがある場合、ほとんどの場合、何らかの意味で優れた特別なソリューションがあります。

RDBMSを使いたくない場合、他のオープンソースキー値またはドキュメントDB(非リレーショナルDB)を試してはいけない理由。

あなたの投稿から、私はあなたがリレーショナルデータベースのACIDプロパティに従うつもりはないことを理解しています。あなた自身のファイルシステムの実装の代わりに他のキー値のデータベース(mongodb、coutchdbまたはhyphertable)を適応させることをお勧めします..既存のアプローチよりも優れたパフォーマンスを提供します。

注:私はこれにも精通していません。これらのアプローチを知らない場合に共有したいだけです

scroll top