4

私はメールサポートシステムに取り組んでいます。保存された各電子メールには、、、、from_emailいくつsubjectdateのフラグ、およびメールのが含まれていcontentsます。明らかに、メールの量は大きくなる可能性があり、私たちのシステムは主に最新のメッセージ (たとえば、過去 14 日間) に焦点を当てており、古いメッセージはアーカイブされていると見なされます。また、いくつかのタグで検索したり、フィルタリングしたりしたいと考えています。

contentメールのリスト ビューの場合、フィールドを考慮する必要はありません。すべてのデータを 1 つのテーブルに格納するオプションと、LONGTEXTメール本文を格納する別のテーブルの 2 つのオプションを検討しています。

SELECTSQLフィールドにフィールドが含まれていないと仮定すると、contentそれを別のテーブルに置く方が効率的ですか? 明らかに、LONGTEXTフィールドには固定長の行データが格納されていませんが、インターリーブできるので、リスト ビュー用にフェッチする必要があるページ数が多くなると思います。

MariaDB 5.5.25 と InnoDB エンジンを使用しています。

4

1 に答える 1

4

この情報は、MySQL 5.5 マニュアルのセクション 14.3.12.2 で見つけました。ファイルスペース管理

[InnoDB] 行の長さがページの半分未満の場合、そのすべてがページ内にローカルに格納されます。ページの半分を超える場合、行がページの半分に収まるまで、可変長の列が外部オフページ ストレージとして選択されます。オフページ ストレージ用に選択された列の場合、 InnoDB は最初の 768 バイトをローカルに行に格納し、残りを外部のオーバーフロー ページに格納します。このような各列には、オーバーフロー ページの独自のリストがあります。768 バイトのプレフィックスには、列の実際の長さを格納する 20 バイトの値が付随し、残りの値が格納されるオーバーフロー リストを指します。

簡単に言えば、主キーとロングテキストのみでテーブルを作成すると、ロングテキストが 8000 バイト (ページの半分) を超える場合、InnoDB は行を分割します。

InnoDB はおそらく長いメールの行を分割するため、保存されたメール テーブルの行の最後に長いテキストを配置することをお勧めします。

すべての固定長の列を行の先頭に配置し、可変長の列を行の最後に配置することは、データベースの適切な実践方法です。

于 2013-07-10T13:52:50.550 に答える