問題のあるクエリを最適化する場合、クエリ結果を取得する方法を変更する必要がありますが、これは 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 を設定する方法
以前、Docker コンテナとローカル マシン間のファイル転送に関する記事を書きました。しかし、この...
目次一方向データフローの説明Vue2.x の使用法親コンポーネントに変更を通知するイベントのフォーム...
遅い問題を完全に解決したい場合は、MySQL を MySQL 8.0 にアップグレードすることをお勧...
先週末、兄弟プロジェクトはより良いサービスを提供するためにサーバーを拡張する準備をしていました。兄弟...
サイト全体で https アクセスを有効にしてから、共有コードが利用できなくなり、有効になっていた小...
CSS にカスケード メカニズムがあるのはなぜですか? CSS では、同じ要素の特定のプロパティに同...
目次概要Vuex の 4 つの主要オブジェクト状態の使用突然変異の使用ゲッターの使用アクションの使用...
MySQL 8.0.16 にインストールする場合、「UTF8B3」ではなく「UTF8B4」が使用さ...
許可が拒否されました:その理由は、ファイルの読み取り、書き込み、作成、削除などの権限がないためです。...
1. 単一列インデックスどの列にインデックスを作成するかを選択することは、パフォーマンス最適化プロ...
ボックスモデルの計算<br />マージン + ボーダー + パディング + コンテンツC...
1. 絶対位置とマージンを使用するこの方法の原則は、左側と右側をドキュメントの流れから外れるように配...
コードをコピーコードは次のとおりです。 <スタイル タイプ="text/css&qu...
<br />通常、HTML では次の方法で DOCTYPE を宣言します。 <!D...
説明するこのインターフェースを呼び出すときは、次の点に注意する必要があります。パブリック IP アド...