2012-12-07 13 views
14

SOトラフを探している間、私は2つの矛盾の答え(およびことを述べても、コメント)を発見しましたが、決定的な答え:TEXT/BLOBを同じテーブルに格納するかどうか

問題がある:任意のパフォーマンス上の利点があり、あなたはTEXT/BLOBフィールドを格納する場合テーブルの外に?

は、我々が想定しています

  • あなたは正しく選択(必要な場合にのみ選択にTEXT/BLOBを、全くSELECT *)
  • テーブルは、それが(それが "の問題ではないのです理にかなっている場合は、適切にインデックス化されていませんあなたがそれをインデックス化した場合 ')
  • データベースデザインは本当に重要ではありません。これは、特定のデータベース設計上の問題を解決するのではなく、この特殊なケースにおけるMySQLの動作を特定するための質問です。 (TEXT/BLOBが離れてしまった場合、または2)のは、このデータベースが1つのテーブルのみを有する
  • 使用されるエンジンを想定してみましょう:InnoDBの

これを(彼らは異なる結果をフェッチする場合は他の人が、あまりにも興味深いものになるだろう) TEXT/BLOBを別のテーブルに入れることは、間違った方法で選択している場合にのみ役に立ちます(必ずしもTEXT/BLOBを選択する必要はありません) - は基本的にTEXT/BLOBをとにかくTEXT/BLOBがセブレートに格納されるため、同じテーブルは基本的には(複雑さが少なく、パフォーマンスが低下しないなど)の良いソリューションです

TEXT列を別の表に移動すると、通常、表からすべての列を選択する傾向がある場合にのみ利点があります。これは単に最初のものを補うための第2の悪い習慣を導入するだけです。 2つの間違いが3つの左と同じではないことは言うまでもない。


MySQL Table with TEXT columnこのポストはしかし、と述べている:表は、TEXT、またはBLOB列を有する場合

、テーブルをメモリに格納することができない

これは、パフォーマンスヒットを得るために、テーブルの中にTEXT/BLOBを持つだけで十分であることを意味しますか?

MySQL varchar(2000) vs text?


私の質問は基本的には次のとおりです。正解は何ですか?

SELECTの場合は、別のテーブルにTEXT/BLOBを保存すると本当に問題になりますか?

テーブル内にTEXT/BLOBがあっても、パフォーマンスが低下する可能性がありますか?

+1

使用している特定のストレージエンジンはありますか? InnoDB/MyISAM/NDBなど – gertvdijk

+0

@gertvdijk私はそれを追加しました - 特にInnoDBに関するソリューションに興味がありますが、基本的には違いがあればMyISAMなどのストレージエンジンも面白いでしょう – Katai

答えて

12

は、MySQLのバージョンで利用可能な場合は、MySQLの設定で

innodb_file_format=barracuda 

を使用してInnoDBのバラクーダのファイル形式を使用して、実際にそれを使用するROW_FORMAT=Dynamic(またはCompressed)を使用してテーブルを設定します。

これにより、InnoDBは行ページの外にBLOB、TEXT、およびより大きなVARCHARを格納し、より効率的になります。詳細については、this MySQLperformanceblog.com blog articleを参照してください。

私が理解している限り、Barracuda形式を使用すると、パフォーマンス上の理由から、別のテーブルにTEXT/BLOB/VARCHARを別のテーブルに格納するようになります。しかし、適切なデータベースの正規化を心がけておくことは、常に良いことだと思います。

4

パフォーマンスの向上の1つは、固定長レコードのテーブルを持つことです。これは、varcharやtext/blobのような可変長フィールドを意味しません。固定長レコードでは、サイズオフセットを知っているので、レコードの終わりを「シーク」する必要はありません。また、Xレコードをロードするために必要なメモリ量も分かります。固定長レコードの表は、削除されたレコードから使用可能なスペースを完全に再利用できるため、断片化される傾向がありません。 MyISAMテーブルは実際には固定長レコードからいくつかの利点があります。

innodb_file_per_tableを使用していると仮定すると、tex/blobを別のテーブルに保存すると、テーブルが小さくなるため、ファイルシステムのキャッシュが使用される可能性が高くなります。

つまり、これはマイクロ最適化です。はるかに大きなパフォーマンス向上を得るためにできることは他にもたくさんあります。たとえば、SSDドライブを使用します。あなたのテーブルが大きくなりシャーディングを実装する必要があるときには、計算の日を追い出すためにパフォーマンスを十分に引き上げることはありません。

「ローファイルシステム」を使用しているデータベースについては、はるかに高速になっても、それ以上は聞こえません。 「Raw」は、データベースがファイルシステムをバイパスしてディスクハードウェアに直接アクセスする場合です。私はオラクルがまだこれをサポートしていると思うしかし、複雑さを増やすだけの価値はありません。あなたがしていることを本当に知る必要があります。私の意見では、あなたのテキスト/ BLOBを別のテーブルに保存するだけでは、パフォーマンスが向上する可能性が増します。あなたは実際にあなたが何をしているのか、あなたのアクセスパターンを知ってそれを利用する必要があります。

+0

それは実際にその内部にTEXTを持っているテーブルを意味しますか? MySQLがTEXTを外部に格納する場合、基本的にはその外部ストレージへのポインタである必要があります。したがって、TEXTを別のテーブルに手動で格納するのとほぼ同じでなければなりません。それは基本的には質問です、それはすでに自動的に起こりますか? (分かれている)私が見つけようとしていることは、それがナンセンスであれば、手動で行うことです。 TEXTへの自動「参照」はどのように処理されますか? – Katai

+0

TEXTを「外部」に保存し、TEXTを外部ファイルに別々のファイルとして保存することには違いがあります。 MySQLはInnodbと同じファイルにインデックスとデータが格納されているように、ファイルに "外部"を格納します。別のテーブルに格納すると、別のファイルになります。手動で行うのはナンセンスではありませんが、パフォーマンスを1%向上させることはありません。あなたが何百万という記録を持つまで、それは測定できません。 –

関連する問題