web-dev-qa-db-ja.com

ファイルまたはデータベースサーバーのデータにアクセスする方が速いですか?

フォルダーとファイルで構成される静的データベースがある場合、CGIスクリプトで使用されると考えると、SQLサーバータイプのデータベースよりもアクセスと操作が高速になりますか?

ファイルとフォルダーを使用する場合、パフォーマンスを向上させるための秘whatは何ですか?

48
Jeremy Gwa

群衆次第です。

これは、一般的な答えはありませんが、現在の状況に大きく依存する種類の質問です。 DBのオーバーヘッドといくつかのDB接続の信頼性の問題を組み合わせて、フラットファイルを使用することをお勧めしたため、最近、SQLデータベースからフラットファイルシステムにデータを移動しました。

選択を行うときに私が自問するいくつかの質問は次のとおりです。

  1. データをどのように消費していますか?たとえば、入力した順序で最初から最後の行まで読んでいるだけでしょうか?または、複数の条件に一致する行を検索しますか?

  2. 1つのプログラムの実行中にデータにアクセスする頻度はどれくらいですか?著者としてSalingerを使用してすべての書籍を取得するために一度行ったり、複数の異なる著者を取得するために何度か行ったりしますか?いくつかの異なる基準に複数回アクセスしますか?

  3. データを追加するにはどうすればよいですか?最後に行を追加するだけで検索に最適ですか、それとも再ソートする必要がありますか?

  4. コードは6か月でどのように論理的になりますか?これを強調するのは、これが物事の設計においてあまりにも頻繁に忘れられていると思うからですエンジニア)。コードを保守しなければならない(または別のプロジェクトの作業後に行う)6か月の間に、どの方法でデータを保存および取得するのがより理にかなっています。フラットファイルからDBに移行すると、効率が1%向上しますが、コードを更新する必要がある場合に1週間の理解が得られれば、本当に改善できます。

56
HerbN

情報が何であるか、アクセスパターンと規模が何であるかによって異なります。リレーショナルデータベースの最大の利点は次の2つです。

  1. キャッシング。あなたが非常に賢明でない限り、DBサーバーのキャッシュほど良いキャッシュを書くことはできません。

  2. オプティマイザ。

ただし、特定の特殊なアプリケーションでは、これら2つの利点のいずれも、ファイル+フォルダーのデータストアと比較して明確になりません。したがって、答えは圧倒的な「依存」です。

ファイル/フォルダーに関しては、コツは次のとおりです。

  • 頻繁に要求されるファイルのコンテンツをキャッシュする
  • 小さなディレクトリがあります(深くネストされた小さなディレクトリ内のファイルは、大きなディレクトリの内容を読み取るのに時間がかかるため、よりフラットな構造よりもはるかに高速にアクセスできます)。
  • その他のより高度な最適化(ディスク全体のスライス、ディスクまたは異なるパーティションの異なる場所への配置など)がありますが、THATレベルが必要な場合は、まずデータベースを使用することをお勧めします。
18
DVK

一般的な規則として、データベースはファイルよりも低速です。

ファイルのインデックス作成が必要な場合、カスタマイズされたインデックス作成構造上のハードコードされたアクセスパスは、正しく行うと常に高速になる可能性があります。

ただし、ファイルベースのソリューションよりもデータベースを選択する場合、「パフォーマンス」は目標ではありません。

データベースが提供するメリットをシステムが必要とするかどうかを自問する必要があります。その場合、小さなパフォーマンスオーバーヘッドはかなり許容できます。

そう:

  1. 複数のユーザーと同時更新に対処する必要がありますか? (まあ、あなたはそれが静的だと言いました。)
  2. さまざまな角度からデータを簡単に照会するために柔軟性が必要ですか?
  3. 複数のユーザーがいますか?また、既存のセキュリティモデルを利用することで利益を得ることができますか?

基本的には、質問のほうが開発が容易です。この2つのパフォーマンスの違いは、開発時間を無駄にする価値はありません。

17
Disillusioned

私の少しの経験から、サーバーベースのデータベース(ローカルマシンで提供されるものも含む)は、ローカルファイルシステムと比較してスループットが非常に遅い傾向があります。ただし、これはいくつかの事柄に依存し、そのうちの1つは漸近的な複雑さです。大きなファイルのリストをスキャンして、インデックス付きのデータベースを使用してアイテムを検索することと比較すると、データベースが優先されます。

私のほんの少しの経験はPostgreSQLについてです。 300万行のテーブルがあり、たった8,000レコードを更新しました。 8秒かかりました。

「時期尚早の最適化はすべての悪の根源です。」という引用に関しては、私はそれを一粒で考えます。データベースを使用してアプリケーションを作成し、それが遅いとわかった場合、ファイルシステムベースのアプローチまたは他の方法(SQLiteなど)に切り替えるのに非常に時間がかかる場合があります。最善の策は、ワークロードの非常に単純なプロトタイプを作成し、両方のアプローチでテストすることです。この場合、どちらが速いかを知ることが重要だと思います。

8
Joey Adams

他の人が指摘したように:それは依存します!

本当に目的に応じてパフォーマンスが向上するものを見つける必要がある場合は、各形式で保存するサンプルデータを生成して、ベンチマークを実行します。 Benchmark.pmモジュールにはPerlが付属しており、次のようなものと並べて比較することが非常に簡単になります。

use Benchmark qw(:all) ;

my $count = 1000;  # Some large-ish number of trials is recommended.

cmpthese($count, {
    'File System' => sub { ...your filesystem code... },
    'Database'    => sub { ...your database code... }
});

perldoc Benchmarkと入力すると、より完全なドキュメントを取得できます。

4
John Hyland

サイト構造が適切な場合、画像に関してはdbではなくファイルを使用すると非常に便利です。一致するデータを表すフォルダーを作成し、内部に画像を配置します。たとえば、記事サイトがある場合、記事をデータベースに保存します。 dbにイメージパスを配置し、1,2,3 ..のような主キーを持つフォルダーに名前を付けて、内部にイメージを配置する必要はありません。電子書籍、音楽ファイル、ビデオ、このアプローチはすべてのメディアファイルで使用できます。何かを検索しない場合、xmlファイルでも同じロジックが機能します。

3
Kuzgun

他の人が言ったように、依存する:データのサイズと性質、およびその上で実行する予定の操作に依存します。

特にCGIスクリプトの場合、すべてのページビューでデータベースサーバーに接続するとパフォーマンスが低下します。ただし、単純なファイルベースのアプローチを作成すると、パフォーマンスの問題が簡単に発生する可能性があります;-)

Berkeley DB Fileソリューションと同様に、SQLiteの使用も検討できます。これにより、ローカルファイルに格納されているデータベースへのSQLインターフェイスが作成されます。 DBIとSQLを使用してアクセスできますが、サーバー、構成、またはネットワークプロトコルはありません。これにより、将来データベースサーバーが必要な場合に簡単に移行できるようになります(例:複数のフロントエンドサーバーを使用するが、状態を共有する必要がある場合)。

詳細を知らなくても、SQLite/DBIソリューションを使用してからパフォーマンスを確認するをお勧めします。これにより、比較的簡単な起動と適切なパフォーマンスで柔軟性が得られます。

1
FalseVinylShrub

ファイルにすばやくアクセスするには、何をしているのかにもよりますが、mmapは非常に便利です。 効果的なPerl ブログで それらを丸lurみするのではなくメモリマップファイル としてこれについて書いたばかりです。

ただし、データベースサーバーの方がはるかに高速になると予想しています。あなたが何をしているか、どのような種類のデータにアクセスする必要があるかなどわからないときに、あなたにとって何が速くなるかを言うのは困難です。

1
brian d foy

データのプロファイルと、データにアクセスするために使用するロジックによって異なります。名前付きノードを単に保存して取得する必要がある場合は、ファイルシステムベースのデータベースがより高速で効率的です。 (その目的のためにBerkeley DBもご覧ください。)インデックスベースの検索を行う必要がある場合、特にキーに基づいて異なるデータセットを結合する必要がある場合は、SQLデータベースが最善の策です。

私はあなたのアプリケーションにとって最も自然と思われるソリューションを選びます。

1
Nate C-K

私はあなたに他の人があなたに与えたのと同じ答えを与えるつもりです、それは依存します

データを返す単一サーバー(読み取り専用)を使用した単純なシナリオでは、Yesファイルシステムは優れた管理が容易になります。

ただし、複数のサーバーがある場合は、 glusterfsceph などのような分散ファイルシステムを管理する必要があります。

データベースは、分散ファイルシステム、圧縮、読み取り/書き込み、ロックなどのすべてを管理するためのツールです。

お役に立てば幸いです。

0
Doron Segal

他のDBと同様にツールであり、オーバーヘッドが発生しますが、データが静的でファイルからディレクトリを読み取る読み取り専用の場合は、次のようになります:私が行ったいくつかのテスト:ファイルの名前は.csvです。データベースでは、データベースで同じレコードを見つけるために、「date」として列にインデックスを付けていました。毎日、30K〜50Kのレコード/行と異なるタイプのデータの100列(フロート90%)があります。

DB情報:PostgreSQL 11.5、16GBのRAM

  Table:
    335,162,867 records
    Table size: 110GB
    Index size: 7GB
    Total size: 117GB
  Files:
    Number of files: 8033
    Total Files size: 158GB
    Number of records/lines per file/date: 30K - 50K

ランダムな日付(1986-2019)のデータをファイルから読み取ることは、PostgreSQLで同じ日付のデータを読み取るよりも常に4-5倍高速でした

0
Vlad Bezden