29

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

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

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

4

5 に答える 5

30

データ型を使用してファイルを保存できることを読みました。

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

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

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

それに加えて、データベースに大量のデータを保存すると、速度が低下する場合があります。特に、データベースのホスト専用ではないシステムで。

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

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

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

実際、それは使用しているストレージ エンジンによって異なります。これは、すべてのエンジンがデータを処理し、異なる方法で保存するためです。リレーショナル データベースに適した InnoDB エンジンについては、 MySQLでのブロブの格納方法に関するMySQL パフォーマンス ブログのこの記事を参照してください。

しかし、要約すると、MySQL 5 以降では、ブロブは次のように保存されます。

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

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

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

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

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

だから私はそれを言うだろう

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

MySQLを管理せ(Web ホストなど)、OS を変更したり、バックアップを作成したりする予定がない場合はvarchar、ファイルを指す列を使用してください。

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

于 2012-11-17T22:38:49.027 に答える
12

データを 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 に保持しようとします。

于 2012-11-17T23:15:43.237 に答える
7

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

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

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

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

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

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

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

于 2012-11-17T23:07:55.167 に答える
3

ファイルシステムへのアクセスは、データベース経由よりも高速になります。ブロブ列には、インデックス作成/並べ替えなどの点でいくつかの欠点があります。将来必要に応じて、ファイル名列で行うことができます。

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

于 2012-11-17T22:11:44.583 に答える
2

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

于 2012-11-17T22:05:25.583 に答える