多くのファイルをアップロードおよび削除するアプリケーションをコーディングしています。通常は、ファイルをサーバー内のフォルダーに移動し、一意のid
という名前を付けます。しかし、MySQLでバイナリデータ(ファイル)を保存することもできるので、これを選択する方がよいでしょう。
BLOBを使用するとパフォーマンスが向上するのはいつかなど、確実な引数を使用してください。
PS:それが問題ならMyISAMを使っています。
ありがとう。
UPDATE:
関連する質問:
- DBへのイメージの保存-はいまたはいいえ
- すべきこと、すべきでないこと:画像をデータベースに保存 (Sebastianに感謝)
更新2
ファイルをデータベースに保存する必要はありませんこれをフォルダーに保存するよりも良い方法を知りたいです。
読んだ:
どれが結論
画像を取得する必要があり、複数の異なるWebサーバーで使用できる必要がある場合。しかし、私はそれでほとんどだと思います。
- 複数のサーバーで使用できる必要がない場合は、常にファイルシステムに配置することをお勧めします。
- 複数のサーバーで使用できるようにする必要があり、実際にシステムになんらかの負荷がある場合は、何らかの分散ストレージが必要になります。
MyISAM dbエンジンを使用している場合は、BLOBフィールドにインデックスを付けることができるため、データベースを使用してファイルをすばやく検索できます。
また、ファイルをBLOBフィールドに格納するもう1つの利点は、ディスク上のファイルよりも効率的にアクセスできることです(ディレクトリトラバーサル、オープン、読み取り、クローズが不要です)。
多くのファイルをMYSQLに格納することを計画している場合は、通常、ファイルを別のテーブルに格納することをお勧めします。これにより、ブロブにつまずくことなくメタ情報をスキャンできます。次に、実際にblobをフェッチする必要がある場合、JOINは十分に効率的です。
まあ、それは少し古いですが、この記事はBLOBストレージについていくつかのまともな議論をします: http://www.dreamwerx.net/site/article01 。
それ自体はパフォーマンスの向上ではありませんが、ディレクトリではなくDB内に画像を配置することで、ホットリンクの問題も解消されます(これは公開されているWebアプリであると想定しています)。
Memcacheは、分散サーバー全体で冗長性とTTLを管理する必要があるため、維持が困難になるため、代替ソリューションではありません。
私の意見では、より良い解決策は、複数のサーバー間での配布を容易にするために、設計で配布されるCDNにパブリック静的データを配置し、DBにプライベート静的データを配置することです。
各サーバーは、ヒットごとに独自のMemcacheを実装できます。
ファイルシステムにすでにデータを保存していて、それをデータベースに移行したい場合、最も簡単な方法は、次のキーと値のテーブルを作成することです。
KEY = '/ image/filename'(ファイルシステムの場所の文字列)、value = BLOB(実際のファイル)、および書き換えルールとアプリケーション処理の助けを借りてデータベースからこれを取得するラッパーを構築します。このようにして、既存のコードで完全な透過性を使用できます。
MySQLを使用する必要がありますか?そうでない場合は、ODBMSまたはPostgreSQLを試してファイルを保存するか、ファイルのパスのみを保存してください。たとえば this を参照してください。