2008-09-20 12 views
1

インデックス付きのMySQLテーブルで、7つのカラムが常にクエリされ、書き込まれるとします。データを他のテーブルに分割してパフォーマンスを向上させるには、このテーブルに含めることが推奨される行の数はどれくらいですか?MySQL:推奨行数

答えて

11

データをパーティション分割してパフォーマンスを向上させるかどうかは、データとその上で実行するクエリによって異なります。何百万もの行をテーブルに格納することができます。また、優れたインデックスとうまく設計されたクエリを使用すると、それはまだ超高速です。あなたのインデックスとクエリができるだけ良いと確信している場合にのみ、パーティション化を検討してください。

+1

私はこの回答を受け入れました。なぜなら、これは最も実用的だと思われるからです。他の人が役に立つものを見極める要因を与えましたが、何かがうまくいかないときはいつも周りにいるわけではないので、私の質問に対する最良の文字通りの答えは「数百万」と感じます。 – tags2k

0

実際にパフォーマンスが問題になったテーブルサイズを指摘できたのですが、私はあなたがそれを予測できるとは思いませんし、確かにこのようなWebサイトに与えられた情報からではありません!

いくつかの質問あなたは有効に自分自身を頼むかもしれない:パフォーマンスが現在許容

  • ですか?
  • パフォーマンスの測定方法 - メトリックは ですか?
  • は、許容できないパフォーマンスをどのように認識しますか?
  • は、 を予測する可能性があります。
  • を使用しているすべてのクエリは効率的なインデックスですか?
  • 極端な負荷とボリュームをシステム上でシミュレートしましたか?
0

デフォルトを変更しない限り、MyISAMエンジンを使用すると、テーブルサイズに2GBのハード制限が適用されます。

3

何のマジックナンバーはありませんが、特にパフォーマンスに影響を与えるいくつかあります:

  • インデックスのカーディナリティは:(ENUMのような)2つのまたは3の値を持つ行のインデックスを作成する気にしないでください。大きなテーブルでは、クエリオプティマイザはこれらを無視します。
  • 書き込みとインデックスの間にトレードオフがあります。あなたが持っているインデックスが多いほど、書き込みが長くなります。列ごとにインデックスを作成するだけではありません。クエリを分析して、アプリのインデックスに登録する必要のある列を確認します。
  • ディスクIOとメモリが重要な役割を果たします。あなたのテーブル全体をメモリに収めることができれば、ディスクIOを式から取り除くことができます(テーブルがキャッシュされると、とにかくキャッシュされます)。私の推測では、テーブルが大きすぎてメモリをバッファすることができない場合、大きなパフォーマンスの変化が見られるということです。
  • 使用に基づいてサーバーをパーティション化することを検討してください。トランザクションシステムが単一行の読み取り/書き込みを行っている場合、集計レポートのためにデータを読み取り専用サーバーに複製することで、おそらく自分自身を購入することができます。

ご存じのように、テーブルのパフォーマンスはデータサイズに基づいて変化します。あなたのテーブル/クエリに注目してください。あなたはそれがいつ変化するのかを知るでしょう。

0

必要がないと思われる最適化を適用しないでください。理想的には、これはテストによって決定されるべきである(他のものが示唆したように)。

水平または垂直パーティショニングはパフォーマンスを向上させますが、アプリケーションを複雑にします。あなたがそれを必要としていると確信していない限り、それをしないでください。それは間違いなく助けになるでしょう。

2GデータのMyISAMファイルサイズはデフォルトであり、テーブル作成時(またはそれ以降はALTERによって変更できますが、テーブルを再構築する必要があります)に変更することができます。他のエンジン(InnoDBなど)には適用されません。

+0

"必要がないと思うなら最適化を適用しないでください" - おそらく、データベーステーブルを分割し、それが何をするのかが分かりませんが、一般的にこれはひどいアドバイスですか?何かが間違っている/遅くなるのを待ってから、数時間/日をかけて固定しますか? – tags2k

+0

私は「何かが間違っているのを待っている」と主張するのではなく、さらに最適化が必要かどうかを評価するためにパフォーマンステストを行っています。多くの場合、人々は不要な最適化を適用するため、コードの複雑さが増します(保守性が低下し、バグの可能性が増します)。 – MarkR

0

実際、これはパフォーマンスにとっては良い質問です。 Jay Pipesを読んだことがありますか?特定の数の行はありませんが、読み取りには特定のページサイズがあり、垂直パーティショニングには適切な理由があります。

彼のカンフーのプレゼンテーションをチェックし、彼のポストを見てください。彼はこれについていくつかの有用なアドバイスを書いていることがわかります。

0

MyISAMを使用していますか?数ギガバイト以上を保管する予定ですか? MAX_ROWSとAVG_ROW_LENGTHに注意してください。

Jeremy Zawodnyはこの問題を解決する方法についてexcellent write-upを持っています。

2

MySQL 5にはpartitioningが組み込まれていて、とても素敵です。テーブルの分割方法を定義することができます。たとえば、ほとんどの場合ユーザーIDに基づいてクエリを実行すると、ユーザーIDに基づいてテーブルをパーティション化できます。また、日付でクエリを実行している場合は日付でパーティションを作成できます。この点については、MySQLがあなたの値を見つけるために検索するパーティションテーブルを正確に知ることができます。欠点は、パーティションを定義していないフィールドを検索して各テーブルをスキャンすると、パフォーマンスが低下する可能性があることです。