web-dev-qa-db-ja.com

BLOBへのデータの保存とファイルへのポインターの保存の違いは何ですか?

MySQLのblobデータ型について質問があります。

データ型はファイルの保存に使用できると読みました。また、ファイルをディスクに保存し、データベース内のその場所へのポインターを(varchar列を介して)含める方法もあると読みました。

しかし、BLOBフィールドは行内に格納されておらず、その内容を取得するには別のルックアップが必要であることを読んだので、少し混乱しています。それは、ファイルシステム上のファイルへのポインタを格納することと何が違うのですか?

23
user1832628

データ型はファイルの保存に使用できると読みました。

Blobの MySQLマニュアル ページによると、A BLOBは、可変量のデータを保持できるバイナリラージオブジェクトです。

これはバイナリデータを格納するための固有のデータタイプであるため、ファイルをバイナリ形式で格納するために使用するのが一般的で、画像ファイルを格納することはWebアプリケーションで非常に一般的に使用されます。

Webアプリケーションの場合、これは、最初にファイルをバイナリ形式に変換してから保存する必要があることを意味します。ファイルを取得する必要があるたびに、ファイルを元の形式に変換する逆のプロセスを実行する必要があります。

それ以外に、大量のデータをdbに保存すると[〜#〜] may [〜#〜]遅くなります。特に、データベースのホストのみに専用されていないシステムで。

私はまた、ファイルをディスクに保存し、データベース内のその場所へのポインターを含めることもできることを読みました

上記のすべての考慮事項を念頭に置いて、Webアプリケーションの一般的な方法は、MySQL以外の場所にファイルを保存し、そのパスをデータベースに保存することです。このアプローチ[〜#〜] may [〜#〜]大量のデータを処理するときにデータベースを高速化します。

しかし、BLOBフィールドは行内に格納されておらず、その内容を取得するために別のルックアップが必要であることを読んだので、少し混乱しています。

実際、すべてのエンジンがデータを処理し、さまざまな方法で格納するため、使用しているストレージエンジンによって異なります。リレーショナルデータベースに適したInnoDBエンジンについては、この記事を MySQL Performance blog から参照して、MySQLでのblobの保存方法を確認することができます。

しかし、要約すると、MySQL 5以降では、BLOBは次のように格納されます。

Innodbは、行ページにBLOB全体を保存するか、ページに保存する小さな列を優先する20バイトのBLOBポインターのみを保存します。これは、より多くの列を保存できるため、妥当です。

したがって、おそらくあなたは正しい方法がそれらを個別のファイルとして保存することであると考えているでしょうが、データを保存するためにblobを使用することにはいくつかの利点があります、(私の意見では)最初のものはバックアップです。私は小さなサーバーを管理していて、パスとして保存されているファイルを別のストレージディスクにコピーするためだけに別のサブルーチンを作成する必要がありました(適切なテープバックアップシステムを購入する余裕はありませんでした)。 blobを使用するようにアプリケーションを設計した場合、単純なmysqldumpでデータベース全体をバックアップすることができます。

バックアップ用にBLOBを保存することの利点については、 この投稿 で詳しく説明しています。回答した人が私のものと同様の問題を抱えていました。

もう1つの利点は、セキュリティと、アクセス許可とアクセスの管理の容易さです。 MySQLサーバー内のすべてのデータはパスワードで保護されており、誰が何にアクセスし、誰がアクセスしないかに関するユーザーのアクセス許可を簡単に管理できます。

認証と使用のためにMySQL特権システムに依存するアプリケーション内。侵入者がディスクまたはイメージにアクセスするためのアクセス権を持たないユーザーからイメージ(または圧縮されたイメージのようなバイナリファイル)を取得することは少し難しいので、それはプラスです。

だから私はそれを言う

MySQLとその中にあるすべてのデータを管理し、定期的なバックアップを行う必要がある場合、またはOSの変更または将来の変更を検討する予定で、適切なハードウェアを使用してMySQLを最適化する場合は、BLOBを使用してください。

しない MySQLを管理し(Webホストなどの場合)、OSを変更したり、バックアップを作成したりしない場合は、varchar列にファイルを指定します。

お役に立てば幸いです。乾杯

19
Bruno Vieira

データをBLOBフィールドに格納する場合は、それをオブジェクト抽象化の一部にします。

BLOBの利点:

  1. BLOBを含む行を削除する場合、またはマスター/スレーブテーブルの関係の一部として削除する場合、またはテーブル階層全体を削除する場合、BLOBは自動的に処理され、データベース内の他のオブジェクトと同じ存続期間を持ちます。

  2. スクリプトは、必要なすべてを取得するためにデータベース以外にアクセスする必要はありません。多くの場合、ファイルへの直接アクセスにより、アクセスまたはセキュリティ制限を回避する方法について、ワームの缶全体を開くことができます。たとえば、ファイルアクセスでは、実際のファイルを含むファイルシステムをマウントする必要がある場合があります。しかし、データベースにBLOBがある場合、どこにいてもデータベースに接続できればよいだけです。

  3. ファイルに保存し、ファイルが置き換えられるか、削除されるか、アクセスできなくなった場合、データベースは決して知ることができません。つまり、整合性を保証することはできません。また、ファイルの使用時に複数のバージョンを確実にサポートすることは困難です。トランザクションに依存していると、ほとんど不可能になります。

ファイルの利点:

  1. 一部のデータベースでは、BLOBの処理が不十分です。たとえば、MySQLの公式のBLOB制限は4GBですが、実際のデフォルト構成では1MBです。クライアントとサーバーの両方の設定を調整してMySQLコマンドバッファーを増やすことで、これを16〜32 MBに増やすことができますが、これには、パフォーマンスとセキュリティの面で他の多くの影響があります。

  2. データベースに奇妙なサイズ制限がない場合でも、ファイルだけと比較すると、BLOBの保存に常にある程度のオーバーヘッドが生じます。また、BLOBが大きい場合、一部のデータベースは、BLOBを1つずつアクセスするためのインターフェイス、またはstreamを提供しないため、ワークフローの大きな障害となる可能性があります。

最後に、それはあなた次第です。不合理なパフォーマンスの問題が発生しない限り、私は通常、BLOBでそれを維持しようとします。

9
mvp

はい、行と同じページに収まらないMySQL BLOBはオーバーフローページに保存されます。他の列と同様に、一部のBLOBは行の残りの部分と一緒に保存できるほど小さいことに注意してください。 blobページは、その行が格納されているページに隣接していないため、それらを読み取るために余分なI/Oが発生する可能性があります。

一方、他のページタイプと同様に、BLOBページはInnoDBバッファープールのメモリを占有する可能性があるため、別のページにある場合でも、その後のBLOBの読み取りは非常に高速です。ファイルはオペレーティングシステムによってキャッシュできますが、通常はディスクから読み取られます。

決定に影響を与える可能性のある他のいくつかの要因を次に示します。

  • Blobは行とともに論理的に格納されます。つまり、行を削除すると、関連付けられたblobが自動的に削除されます。ただし、BLOBをデータベースの外部に格納すると、データベースから行を削除した後に、孤立したBLOBファイルが作成されます。これらのファイルを見つけて削除するには、手動の手順を実行する必要があります。

  • 行に格納されたBLOBもトランザクションセマンティクスに従います。たとえば、新しいblobまたは更新されたblobは、コミットするまで他のトランザクションからは見えません。変更をロールバックすることもできます。データベース外のファイルにblobを保存すると、これは非常に困難になります。

  • Blobを含むデータベースをバックアップする場合、データベースはもちろん非常に大きくなりますが、バックアップする場合、すべてのデータandに関連付けられたblobを1つのステップで取得します。 blobを外部に保存する場合は、データベースをバックアップし、blobファイルを保存するファイルシステムもバックアップする必要があります。データとblobが瞬時にキャプチャされるようにする必要がある場合は、なんらかのファイルシステムスナップショットを使用する必要があります。

  • レプリケーションを使用する場合、ブロブがレプリケーションスレーブに自動的にコピーされるようにする唯一の自動方法は、データベースにブロブを保存することです。

6
Bill Karwin

より良い方法は、ファイルをファイルシステムフォルダーに保存し、データベースのvarcharフィールドを介してそれらのパスをポイントすることです。データベースにファイルを保存することの欠点の1つは、データベースの速度が低下するか、そのパフォーマンスが低下することです。

2
SaidbakR

ファイルシステムへのアクセスは、データベースを介するよりも速くなります。 Blobs列には、インデックス付け/並べ替えなどの点でいくつかの欠点があります。将来的には、必要に応じてファイル名列を使用できます。

また、大きなBLOBがあるとデータベースが急速に大きくなり、バックアップなどのタスクが遅くなります。私は、ファイルシステム上の物理的なストレージを使用して、データベース内のファイルの場所に移動します。

2
Science_Fiction