問題のあるクエリを最適化する場合、クエリ結果を取得する方法を変更する必要がありますが、これは MySQL から同じ結果セットを取得することを意味するものではありません。場合によっては、クエリを、同じ結果が得られるがパフォーマンスが向上する形式に変換できることがあります。ただし、開発効率を向上させるために、異なる結果を得るためにクエリを書き換えることも検討する必要があります。同じ効果を得るためにアプリケーション コードを変更することもできます。この記事では、クエリを書き換える方法に関するヒントをいくつか紹介します。 複雑なクエリとステップバイステップのクエリクエリ設計における重要な質問は、複雑なクエリを複数の単純なクエリに分解する方がよいかどうかです。従来のデータベース設計では、できるだけ少ないクエリで大量の作業を解決することに重点が置かれています。昔は、このほうがよかったでしょう。これは、過去にネットワーク通信のコストが高く、クエリ パーサーとオプティマイザーに負荷がかかっていたためです。 ただし、MySQL は接続の確立と切断を非常に効率的に処理し、単純なクエリにすばやく応答するため、このアドバイスは MySQL にはあまり当てはまりません。今日のネットワーク速度も以前に比べて大幅に向上しています。サーバーのバージョンに応じて、MySQL は通常のマシン上で 1 秒あたり 100,000 件を超える単純なクエリを実行し、ギガビット ネットワーク上で 1 秒あたり 2,000 件のクエリ通信を完了できます。したがって、クエリの分散は以前ほど悪くはありません。 1 秒あたりに走査されるデータ行の数と比較すると、接続応答はまだ比較的遅いです。メモリデータでは、この時間はミリ秒に達します。もちろん、できるだけ多くのクエリを使用することは依然として良い選択です。ただし、複雑なクエリを複数の単純なクエリに分割することでパフォーマンスを向上できる場合もあります。次にいくつか例を挙げます。 クエリを使いすぎるのは、プログラミングにおいてよくある間違いです。たとえば、一部のアプリケーションでは、10 行のデータを取得するために 10 個の個別のクエリを実行します (ループを使用して 1 行ずつ取得します)。これは、10 行のデータを取得する単一のクエリで実行できます。したがって、毎回クエリを分割することを推奨するわけではなく、実際の状況によって異なります。 クエリステートメントを分割する別の方法としては、クエリを分割して再構成する方法があります。大きなデータ クエリを小さなクエリに分割して、毎回影響を受ける行数を減らします。 古いデータの消去は典型的な例です。定期的なデータ クリーニングでは大量のデータを削除する必要があり、大量のデータ行が長期間ロックされる可能性があります。この操作ではトランザクション ログも生成され、大量のリソースが消費され、中断されるべきではない小さなクエリがブロックされる可能性があります。 DELETE ステートメントを中規模のクエリに分割すると、パフォーマンスが大幅に向上し、クエリが繰り返されるときに繰り返しクエリによって発生する余分な待機時間を削減できます。たとえば、次の削除ステートメント: メッセージから DELETE を実行し、 created < DATE_SUB(NOW(), INTERVAL 3 MONTH); アプリケーションの疑似コードは次のとおりです。 影響を受ける行数 = 0 する { 影響を受ける行 = do_query( 「作成されたメッセージからDELETE < DATE_SUB(NOW(), INTERVAL 3 MONTH) 制限 10000") } 影響を受ける行数 > 0 の場合 一度に 10,000 行を削除するのは、各クエリを効率的に実行するには十分な規模のタスクです。十分に短いタスクはサーバーへの影響を軽減します (トランザクション ストレージ エンジンはこれによって恩恵を受けます)。また、時間の経過に伴って負荷を分散し、ロックの保持期間を短縮するために、DELETE ステートメントにスリープ時間を挿入することもお勧めします。 共同クエリの分解多くの高性能アプリケーションでは、共同クエリが分解されます。ユニオン クエリを複数の単一テーブル クエリに分割し、アプリケーション内で結果を結合できます。例えば: SELECT * FROM タグ tag_post を tag_post.tag_id=tag.id に参加します tag_post.post_id=post.id の投稿に参加 ここで、 tag.tag='mysql'; このユニオンクエリは次の部分に分割できます。 SELECT * FROM tag WHERE tag='mysql'; SELECT * FROM tag_post WHERE tag_id=1234; SELECT * FROM post WHERE post.id IN (123, 456, 567, 9098, 8904); 注: tag_id=1234 および post.id IN (123, 456, 567, 9098, 8904) は、前のクエリの結果に基づいて取得された値です。なぜこれをするのですか?一見すると、これは不必要に思えます。クエリの数が増えるだけです。ただし、クエリを再構築すると、次のような利点が得られます。
最後に、ユニオン クエリを分解することで、キャッシュの再利用性が向上し、マルチサーバー分散データ ソリューションが簡素化され、大規模なデータ テーブルで IN クエリを使用して、ユニオン クエリまたは同じテーブルでの複数の繰り返しクエリを置き換えることができることがわかります。 上記は、MySQL がクエリ ステートメントを書き換えるための 3 つの戦略の詳細です。MySQL がクエリ ステートメントを書き換える詳細については、123WORDPRESS.COM の他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
<<: Nginx で Http、Https、WS、WSS を設定する方法
目次父から息子へ息子から父へクロスレベルコンポーネント(親から子孫)父から息子へpropsを通じて値...
1. ダウンロード2. 減圧3. パス環境変数を追加し、mysqlが配置されているbinディレクトリ...
この記事の例では、ボールのスライドとクロスの効果を実現するためのVueの具体的なコードを共有していま...
序文MySQL クラスターを構築する場合、当然のことながら、データの一貫性を確保するために、データベ...
この記事では、1枚以上の写真をアップロードするためのVant Uploaderコンポーネントを紹介し...
概要async/await と Promise の基本的な違いは、await fn() は現在の関数...
ピクセル解決通常、モニター解像度と呼ばれるものは、実際にはモニターの物理的な解像度ではなく、デスクト...
広告を閉じるまでのカウントダウンを実装するために JavaScript を使用するまだフロントエンド...
目次1. テンプレート2. ジェネリック3. ジェネリック再帰4. デフォルトのジェネリックパラメー...
目次1. オブジェクトをマップとして扱わない1. 未定義のプロパティはプロトタイプチェーンを通じてア...
質問1:エラーを報告する書き込み方法: GRANT OPTION を使用して、'123123...
1. 問題の説明何らかの理由により、中国でのDockerイメージのダウンロード速度は特に遅くなります...
この記事では、マウスがドロップダウンボックスの上を通過するときにドロップダウンボックスを表示するため...
v-model を使用してページング情報オブジェクトをバインドします。ページング情報オブジェクトに...
公式ドキュメント: JSON 関数名前説明JSON_APPEND() JSONドキュメントにデータを...