常にクエリと書き込みが行われる、7 つの列を持つインデックス付きの MySQL テーブルを考えてみましょう。データを他のテーブルに分割してパフォーマンスを向上させる前に、このテーブルに含めることを許可する推奨行数は?
8 に答える
データをパーティション分割することでパフォーマンスが向上するかどうかは、データとそのデータに対して実行するクエリによって異なります。何百万もの行をテーブルに格納できますが、適切なインデックスと適切に設計されたクエリがあれば、それでも超高速です。インデックスとクエリが可能な限り優れていると既に確信している場合にのみ、パーティショニングを検討してください。
マジック ナンバーはありませんが、特にパフォーマンスに影響を与えるものがいくつかあります。
- インデックス カーディナリティ: 2 つまたは 3 つの値 (ENUM など) を持つ行にインデックスを作成する必要はありません。大きなテーブルでは、クエリ オプティマイザーはこれらを無視します。
- 書き込みとインデックスの間にはトレードオフがあります。インデックスが多いほど、書き込みに時間がかかります。すべての列にインデックスを付けるだけではありません。クエリを分析し、アプリのインデックスを作成する必要がある列を確認します。
- ディスク IO とメモリが重要な役割を果たします。テーブル全体をメモリに収めることができる場合は、ディスク IO を方程式から外します (テーブルがキャッシュされたら)。私の推測では、テーブルが大きすぎてメモリにバッファできない場合、パフォーマンスが大幅に変化することがわかります。
- 用途に基づいてサーバーを分割することを検討してください。トランザクション システムが単一行の読み取り/書き込みを行っている場合は、データを読み取り専用サーバーにレプリケートして集計レポートを作成することで、ある程度の時間を稼ぐことができます。
ご存じのとおり、テーブルのパフォーマンスはデータ サイズによって変化します。テーブル/クエリに注意してください。変更のタイミングがわかります。
MySQL 5 にはパーティショニングが組み込まれており、非常に優れています。すばらしいのは、テーブルをどのように分割するかを定義できることです。たとえば、主にユーザー ID に基づいてクエリを実行する場合は、ユーザー ID に基づいてテーブルを分割できます。日付でクエリを実行している場合は、日付で実行します。これの良いところは、MySQL がどのパーティション テーブルを検索して値を見つけるかを正確に認識できることです。欠点は、パーティションを定義していないフィールドを検索している場合、各テーブルをスキャンするため、パフォーマンスが低下する可能性があることです。
必要と思わない場合は、最適化を適用しないでください。理想的には、これはテストによって決定されるべきです(他の人がほのめかしているように)。
水平または垂直のパーティション分割は、パフォーマンスを向上させるだけでなく、アプリケーションを複雑にする可能性があります。あなたがそれを必要とし、それが間違いなく役立つと確信していない限り、それをしないでください。
2GデータのMyISAMファイルサイズはデフォルトであり、テーブルの作成時に変更できます(または、後でALTERによって変更できますが、テーブルを再構築する必要があります)。他のエンジン(InnoDBなど)には適用されません。
実際、これはパフォーマンスにとって良い質問です。ジェイパイプを読んだことがありますか?特定の行数はありませんが、読み取り用の特定のページサイズがあり、垂直分割には十分な理由があります。
彼のカンフーのプレゼンテーションをチェックして、彼の投稿を見てください。彼がこれについていくつかの有用なアドバイスを書いていることがわかると思います。
MyISAMを使用していますか?数ギガバイト以上を保存することを計画していますか?MAX_ROWSとAVG_ROW_LENGTHに注意してください。
Jeremy Zawodnyは、この問題を解決する方法について優れた記事を書いています。
後でパフォーマンスが問題になったテーブル サイズを指摘することはできますが、それを予測できるとは思いません。このような Web サイトで提供されている情報からは予測できません。
自問するのに役立ついくつかの質問:
- 現在、パフォーマンスは許容範囲内ですか?
- パフォーマンスはどのように測定されますか? 指標はありますか?
- 容認できないパフォーマンスをどのように認識しますか?
- 問題を予測できるような方法でパフォーマンスを測定していますか?
- すべてのクエリは効率的なインデックスを使用していますか?
- システムで極端な負荷とボリュームをシミュレートしましたか?
MyISAM エンジンを使用すると、デフォルトを変更しない限り、テーブル サイズが 2 GB のハード リミットに達します。