2

次のテーブル構造があります。

EVENT_ID(INT)    EVENT_NAME(VARCHAR)    EVENT_DATE(DATETIME)    EVENT_OWNER(INT)

EVENT_COMMENTSテキストフィールドまたは非常に大きなフィールドを追加する必要がありますVARCHAR

このテーブルにクエリを実行する場所が 2 つあります。1 つは、すべてのイベントを一覧表示するページです (そのページでは、event_comments フィールドを表示する必要はありません)。

そして、event_comments フィールドを表示する必要がある、特定のイベントのすべての詳細をロードする別のページです。

そのイベントの event_id と event_comments を含む追加のテーブルを作成する必要がありますか? または、現在のテーブルにそのフィールドを追加する必要がありますか?

言い換えれば、私が求めているのは、テーブルにテキスト フィールドがあるが、そうでないSELECT場合、テーブルへのクエリのパフォーマンスに影響するかということです。

4

6 に答える 6

2

テーブルにフィールドを追加すると、テーブルが大きくなります。

この意味は:

  • テーブル スキャンに時間がかかる
  • ページとキャッシュに収まるレコードが少なくなるため、キャッシュ ミスのリスクが高くなります。

ただし、結合でこのフィールドを選択すると、さらに時間がかかります。

したがって、このフィールドをこのテーブルに追加すると、それを選択しないクエリの実行が遅くなり、選択するクエリの実行が速くなります。

于 2011-01-26T14:08:53.333 に答える
1

はい、パフォーマンスに影響します。少なくとも、昨日公開されたこの記事によると。

それによると、パフォーマンスの問題に悩まされたくない場合は、それらを別のテーブルに配置し、必要に応じて結合することをお勧めします。

これは相対的なセクションです:

テーブル内の列数を制限してみてください。テーブル内の列が多すぎると、列が少ない場合よりもクエリのスキャン時間が長くなる可能性があります。さらに、通常は使用されない多くの列を含むテーブルがある場合は、NULL 値フィールドでディスク領域も浪費しています。これは、テーブル サイズが必要以上に大きくなる可能性がある、テキストや BLOB などの可変サイズ フィールドにも当てはまります。この場合、追加の列を別のテーブルに分割し、それらをレコードの主キーで結合することを検討する必要があります

于 2011-01-26T14:07:39.963 に答える
0

同じテーブルに置く必要があります。

于 2011-01-26T14:06:30.010 に答える
0

はい、おそらく同じテーブルの他のクエリに影響を与えますが、おそらく気にしないので、とにかく実行する必要があります。

エンジンに応じて、BLOB はインライン (MyISAM)、部分的にオフページ (InnoDB)、または完全にオフページ (場合によっては InnoDB プラグイン) に格納されます。

これらは、ページあたりの行数を減らす可能性があるため、一部のクエリを満たすための IO 操作の数を増やします。

ただし、気にする可能性は非常に低いため、とにかく実行する必要があります。このテーブルには何行ありますか? 10^9 ? それらのうち、blob に対して null 以外の値を持つものはいくつありますか?

于 2011-01-26T14:09:10.087 に答える
0

あまりヒットしないはずですが、パフォーマンスが心配な場合は、常にいくつかのベンチマークを実行し、クエリでEXPLAINを実行して、真の効果を確認する必要があります。

于 2011-01-26T14:09:17.840 に答える
0

どのくらいのイベントが予定されていますか?

何十万ものイベントがトラックに積み込まれていない場合でも、パフォーマンスはいずれにせよ優れたものになる可能性があります。

于 2011-01-26T14:18:32.030 に答える