web-dev-qa-db-ja.com

MySQL BLOBの使用はいつ推奨されますか?

多くのファイルをアップロードおよび削除するアプリケーションをコーディングしています。通常は、ファイルをサーバー内のフォルダーに移動し、一意のidという名前を付けます。しかし、MySQLでバイナリデータ(ファイル)を保存することもできるので、これを選択する方がよいでしょう。

BLOBを使用するとパフォーマンスが向上するのはいつかなど、確実な引数を使用してください。

PS:それが問題ならMyISAMを使っています。

ありがとう。


UPDATE:

関連する質問
- DBへのイメージの保存-はいまたはいいえ
- すべきこと、すべきでないこと:画像をデータベースに保存 (Sebastianに感謝)

更新2

ファイルをデータベースに保存する必要はありませんこれをフォルダーに保存するよりも良い方法を知りたいです。

18
amosrivera

読んだ:

どれが結論

画像を取得する必要があり、複数の異なるWebサーバーで使用できる必要がある場合。しかし、私はそれでほとんどだと思います。

  • 複数のサーバーで使用できる必要がない場合は、常にファイルシステムに配置することをお勧めします。
  • 複数のサーバーで使用できるようにする必要があり、実際にシステムになんらかの負荷がある場合は、何らかの分散ストレージが必要になります。
13

MyISAM dbエンジンを使用している場合は、BLOBフィールドにインデックスを付けることができるため、データベースを使用してファイルをすばやく検索できます。

また、ファイルをBLOBフィールドに格納するもう1つの利点は、ディスク上のファイルよりも効率的にアクセスできることです(ディレクトリトラバーサル、オープン、読み取り、クローズが不要です)。

多くのファイルをMYSQLに格納することを計画している場合は、通常、ファイルを別のテーブルに格納することをお勧めします。これにより、ブロブにつまずくことなくメタ情報をスキャンできます。次に、実際にblobをフェッチする必要がある場合、JOINは十分に効率的です。

9
Roman

まあ、それは少し古いですが、この記事はBLOBストレージについていくつかのまともな議論をします: http://www.dreamwerx.net/site/article01

それ自体はパフォーマンスの向上ではありませんが、ディレクトリではなくDB内に画像を配置することで、ホットリンクの問題も解消されます(これは公開されているWebアプリであると想定しています)。

2
Tieson T.

Memcacheは、分散サーバー全体で冗長性とTTLを管理する必要があるため、維持が困難になるため、代替ソリューションではありません。

私の意見では、より良い解決策は、複数のサーバー間での配布を容易にするために、設計で配布されるCDNにパブリック静的データを配置し、DBにプライベート静的データを配置することです。

各サーバーは、ヒットごとに独自のMemcacheを実装できます。

ファイルシステムにすでにデータを保存していて、それをデータベースに移行したい場合、最も簡単な方法は、次のキーと値のテーブルを作成することです。

KEY = '/ image/filename'(ファイルシステムの場所の文字列)、value = BLOB(実際のファイル)、および書き換えルールとアプリケーション処理の助けを借りてデータベースからこれを取得するラッパーを構築します。このようにして、既存のコードで完全な透過性を使用できます。

1
guykaplan

MySQLを使用する必要がありますか?そうでない場合は、ODBMSまたはPostgreSQLを試してファイルを保存するか、ファイルのパスのみを保存してください。たとえば this を参照してください。

0
user656781