web-dev-qa-db-ja.com

Mysql-列の数がデータベースのパフォーマンスに与える影響

ユーザーのソーシャルメディア情報を格納するテーブルがあります。保存する列は42列あり、1日あたり100,000エントリを保存します。 MyIsamエンジンを搭載する予定で、テーブルに水平分割を使用しますが、私の質問は

  1. 垂直分割も行い、テーブルを2つのテーブルに分割する必要がありますか?
  2. クエリのテーブルから4列のみを選択した場合、他の列の存在が列リストにない場合でもクエリに影響しますか?
4
Jatin Seth

保存する列が42列あり、4列のみを選択している場合、他の列canはクエリに影響します。サーバーがより広いテーブルを選択するために使用するディスクI/Oの量が増えるためです。

主に4つの列が必要な場合、垂直分割を行うとI/Oオーバーヘッドが小さくなりますとなり、そのクエリのパフォーマンスが向上する可能性があります。

同様に、4列のカバリングインデックスも、幅の広い42列の選択よりも少ないI/Oで処理できます。

それはより速くなりますか?それはそうであるはずですが、すべてに依存します他に何がプロセスに関与していますが、明示的に言及されていませんあなたの質問で。

4
RLF

whyの明確な画像がない水平PARTITIONingは、通常は誤りです。これがパフォーマンスに有益であるケースはほとんどありません。 PARTITION BY...句と、それが役立つと考える理由。

InnoDBが今日の方法であることに同意します。

垂直分割は時々便利です。繰り返しますが、正直に答えるためには、さらに詳細が必要です。どれどれ SHOW CREATE TABLE。 38列がTEXTとbig VARCHARsでいっぱいである場合、垂直分割はMyISAMにはおそらく良いアイデアですが、後者のエンジンmayこのような列を別の場所に配置します。 4列が38列より広い場合、この引数はあまり重要ではありません。

あなたは年間4000万行を見ていますか? 「古い」レコードを削除しますか?その場合、水平分割は優れた使用例です。毎週、毎月、または毎年のパーティションを設定し(ただし、5〜50のパーティションを作成するように努めます)、DROP PARTITIONおよびREORGANIZE PARTITIONブログの詳細

3
Rick James

データベース管理における多くの最適化には、共通の目標があります。

  • データのワーキングセットを削減して、メモリに保持する必要のあるデータを減らす

キャッシングの細分性はページレベルで行われるため(ファイルシステムブロックにより、InnoDBとMyISAMのデファクトの両方)、42列の大きな行があると、ページあたりの行数が平均して少なくなり、次のようになります分割なし列のホットサブセットはメモリに保持されますが、非アクティブな列は保持できません。

これにより、一種のキャッシュ希釈が発生し、スキーマを正規化していくつかの異なるテーブルに分割する場合よりも多くのメモリが必要になる場合があります。

(注:InnoDBは、大きなテキスト/ varchar/blob列を個別のページにオーバーフローさせます。InnoDBが進むべき道であるというリックのコメントに同意します。)

1
Morgan Tocker