問題のあるクエリを最適化する場合、クエリ結果を取得する方法を変更する必要がありますが、これは 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 を設定する方法
目次基本的なデータベース操作2) データベースを表示する3) データベースを選択する4) データベー...
戦争パッケージを準備する1. 既存のSpringBootプロジェクトを準備し、pomに依存関係を追加...
前回の記事では、https を使用したローカルノードサービスアクセスを実装しました。前回の記事の効果...
目次v-model 入力で双方向バインディングデータを使用するコンポーネント内の v-model他の...
反復/egrep構文: grep [-cinvABC] 'word' ファイル名-c...
Ubuntu 20.04をインストールする NVIDIAドライバーをインストールする Pytouch...
序文Nginx は、イベント駆動型の非同期非ブロッキング処理フレームワークを使用する軽量 HTTP ...
この記事の例では、キャンバスをベースにした超クールな水の光の効果を実装するための具体的なコードを参考...
目次1. 切り替え方法2. タブを動的に生成する3. キャッシュコンポーネント3.1 キープアライブ...
序文MySQL テーブルの主キーと外部キーを作成するときは、次の点に注意する必要があります。主キーと...
コードをコピーコードは次のとおりです。 <span style="font-size...
序文ミニプログラムを開発する過程では、録音機能を実装し、録音を再生し、録音をサーバーにアップロードす...
多くの場合、ローカル データベースのデータをエクスポートしたり、他のデータベースからデータをインポー...
目次1. 数字を逆にする2. 配列内の最大のn個の数値を取得する3. 階乗を計算する4. 現在の動作...
この記事の例では、商品検索機能を実現するためのJavaScriptの具体的なコードを参考までに共有し...