2011-01-26 4 views
2

私は、次の表の構造を持っている:MySQLのクエリのパフォーマンス

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

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

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

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

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

言い換えれば、私のテーブルにテキストフィールドがある場合、私は質問しますが、私はSELECTそれは私のテーブルへのクエリのパフォーマンスに影響を与えますか?

答えて

2

の主 キーの上にそれらを一緒に参加し、別のテーブルに追加 列を分割をオフに検討すべきです。

  • 表スキャンは、このようにキャッシュの危険性を高め、
  • 少ないレコードがページに、したがって、キャッシュに収まるより多くの時間がかかる

の選択をミスします:

はこれがあることを意味しますただし、このフィールドにはジョインが必要ですが、時間がかかります。

このフィールドにこのフィールドを追加すると、それを選択しないクエリは遅くなり、クエリを選択するクエリは高速に実行されます。

+0

だから、私がそれを分解した場合:同じテーブル:イベントリストページ(テキストフィールドを選択しない)が遅くロードされ、イベントの詳細ページ(テキストフィールドを選択)がより高速に読み込まれます。 異なるテーブルにある:イベントリストページの読み込み速度が速く、イベントの詳細ページの読み込み速度が遅くなります。正しい? –

+0

MySQLのレコードの内部表現についてはわかりませんが、なぜ列の数が必然的にテーブルスキャンを遅くするのかがすぐわかりません。各行に列データのオフセットとテーブルの次の行が含まれている場合は、オフセットへのseek()時間だけを話していますか、それとも何か他のことが起こっていますか? –

+0

@Larry:何が速いのですか?ディスクやRAMから '100'または' 1000'ページを読み込みますか? – Quassnoi

0

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

+2

2つの答えが正反対であるとき、私はそれが大好きです。 – Pieter888

+2

2つの答えが正反対だと私はそれが嫌いです。 ;-) –

+3

2つのコメントが正反対であるとき、私は( 'date(s)%2 == 0? 'love': 'hate'')それは正反対だと言っています –

1

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

それによると、パフォーマンス上の問題を抱えたくない場合は、別のテーブルに配置して、必要に応じてそれらをジョインする方がよいでしょう。

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

テーブル内の列の数を制限してみてください。テーブル のカラム数が多すぎると、クエリのスキャン時間は、 カラム数よりもずっと長くなります。さらに、 が多く、多くの列があり、通常は でない表がある場合は、NULL値フィールドを持つ のディスク領域を無駄にしてしまいます。 これは、可変サイズの フィールド(テキストやBLOBなど)にも当てはまります。ここでは、 テーブルサイズが大幅に大きくなり、必要以上に大きくなる可能性があります。この場合、あなたは が、それはサイズが大きくなり、あなたのテーブルにフィールドを追加したレコード

+0

あまりにも多くの列が4から5になるとは思わない。また、質問には、コメントにヌル値が存在しないことは明記されていません。 –

+0

私はこの文脈でこの議論に同意しません。テーブルを大きくしてスキャン時間を長くするのは正しいことですが、インデックス作成が正しく行われた場合はわずかです。その新しい列がインデックスに含まれていない場合、その理由がわかりません。インデックスのサイズは変わりません。独立したテーブルにもスペースが必要で、追加のインデックスが必要なので、キャッシュ/ヒット率はこの文脈での側面ではないと私は考えていません。 –

+0

私は参照してください。さて、私は答えをOPの参考にしておきます。私は、パフォーマンスが重要な場合、テーブルの余分な列を好むために、アプローチと明確な勝者がない場合の両方をプロファイルすることが最善の策だと思います。 – Simone

0

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

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

これらは、1ページあたりの行数を減らす可能性があり、したがって、いくつかのクエリを満たすIO操作の数が増加します。

しかし、あなたが気にすることはほとんどありませんので、とにかくやるべきです。この表には何行ありますか? 10^9?それらのどれくらいがblobにnull以外の値を持っていますか?

+0

EVENTSテーブルは時間とともに成長するだけなので、10^9の行があるとします。約75%-80%は、ブロブに対して非ヌル値を有する。 –

+0

この場合、10^9に近づくと、それについて考えるべきでしょう。今年の生産で何行目を期待していますか? – MarkR

+0

私はおそらく年間数万行を得るでしょう。しかし、私は数十万行がある特定の状況で、どちらが優れているのか不思議です。 –

0

パフォーマンスが心配される場合は、benchmarksを実行し、クエリにEXPLAINsを実行して、実際の効果を確認する必要があります。

0

予定しているイベントはいくつですか?

もしあなたが数十万イベントの荷物を持っていなければ、あなたのパフォーマンスはどんな場合でも良いでしょう。

+0

私はおそらく、年間数万行を得るでしょう。しかし、私は数十万行がある特定の状況で、どちらが優れているのか不思議です。私は私のMySQLのdbは簡単にはるかに処理することができます知っているが、それは問題ではなかった。 –

+0

私はここで他のエキスパートにコメントを残します:-)、とにかく数百の行と時間を照会してテーブルを埋める時間があれば。タイミングに関してのみ、 "SELECT SQL_NO_CACHE <残りのクエリ>"(もちろんライブサイトではない)を使用します。 – stivlo

関連する問題