0

大量のテキストを格納するデータベース システムを構築しています。

テキストは、id 列と 1 つの varchar/text 列を持つテーブルに格納されます。

大きなvarcharを使用する単一のテーブルを使用する方が効果的か、またはそれぞれ異なるテキストタイプを使用する複数のテーブルを使用する方が効果的かどうか疑問に思っていました。

複数テーブル オプションには、それぞれ異なる種類のテキスト (tinytext、text など) を使用する複数の異なるテーブルが含まれ、システムはテキストの長さに基づいて最も適切なテーブルにテキストを格納します。

速度とストレージ スペースの両方に関心があり、両方のバランスをとるソリューションが必要です。

編集 -

テキスト テーブルは検索されませんが、結合される場合があります (通常、ID 番号が決定されてから、1 つの行がアクセスされます)。

通常、サイズはテキストよりも小さくなりますが、中には中程度のテキストが必要なほど大きいものもあります。ロングテキストが必要になるとは思えません。

4

1 に答える 1

1

複雑にしないでおく!真剣に。

圧倒的多数のテキスト項目が 255 文字以下でない限り、または を使用してTEXTくださいLONGTEXT。複雑なデータ構造をいじるのではなく、テキストで面白いことをすることに時間を費やしてください。今すぐプロジェクトを完了してください。後で最適化します。

ディスク ドライブと RAM は、あなたの時間よりもはるかに速く安くなります。

アプリの要件で、テキスト データではなく、簡潔さと検索可能性のために varchar データを使用することが絶対に必要な場合は、次の手順を実行できます。

articleテキスト記事ごとに 1 行のテーブルを作成します。タイトル、著者、article_id.

のような名前の 2 番目のテーブルを作成しますarticle_text。おそらく、4 つの列があります。

  article_id    foreign key to article table.
  language      a language code, if you happen to store translations of articles
  ordinal       a sequence number
  textfrag    varchar(255)  part of the text.

各記事のテキストarticle_textを昇順の一連の行に格納しordinalます。それぞれtextfrag最大 255 文字のテキストを保持します。記事のテキストを取得するには、次のようなクエリを使用します。

 SELECT textfrag 
   FROM article_text
  WHERE language = 'en_US'   /* or whatever */
    AND article_id = 23456   /* or whatever */
  ORDER BY ordinal

次に、一連の行をフェッチし、textfragアイテムのコンテンツを連結すると、有効な長さ制限のない記事ができます。すべてのフィールドを含むインデックスを作成すると、すべての検索がインデックスから行われるため、検索時間が非常に速くなります。

  (article_id, language, ordinal, textfrag)

最善を尽くしてテキストを単語境界でフラグメントに分割し、MyISAM を使用し、FULLTEXT インデックスを使用すると、非常に効果的な全文検索システムが得られます。

于 2013-07-27T19:39:28.583 に答える