この間、プロジェクトに取り組んでいるときに、データ間の接続が非常に複雑なモジュールに遭遇しました。テーブルを作成するときに非常に混乱しました。これらの複雑なデータをどのように処理すればよいでしょうか。単一のテーブルをクエリしてから、ビジネス レイヤーでデータ間の関係を処理する必要がありますか。それとも、複数テーブル接続クエリを通じてデータの関係を直接処理する必要がありますか。 資料を調べたりブログを読んだりした結果、答えは 2 つあります。 1. 「高性能 MySQL」の回答多くの高性能アプリケーションは、関連するクエリを分解します。簡単に言えば、各テーブルに対して単一のテーブルクエリを実行し、その結果をアプリケーションで結合するだけです。たとえば、次のクエリ: タグから*を選択 tag_post.tag_id=tag.id の tag_post に参加 tag_post.post_id=post.id の投稿に参加 ここで、tag.tag='mysql'; 代わりに次のクエリに分解できます。 tag='mysql' のタグから * を選択します。 tag_id=1234 の tag_post から * を選択します。 IDが(123,456,567,9989,8909)の投稿から*を選択します。 いったいなぜこんなことをするのでしょうか? 一見すると、これを行うメリットはありません。元のクエリはここでは複数のクエリになり、返される結果はまったく同じです。 実際、関連するクエリを分解してクエリを再構築すると、次のような利点があります。(同時実行性が高く、パフォーマンスの高いアプリケーションでは、通常、単一テーブルクエリを使用することをお勧めします) 2. クエリを分割した後、単一のクエリを実行すると、ロックの競合を減らすことができます。 3. アプリケーション層で関連付けを行うと、データベースを分割しやすくなり、高いパフォーマンスとスケーラビリティを実現できます。 4. クエリ自体の効率も向上する可能性があります。 5. 冗長なレコードのクエリを削減できます。 6. さらに、これは MySQL のネストされたリング結合を使用するのではなく、アプリケーションでハッシュ結合を実装することと同じです。シナリオによっては、ハッシュ結合の方がはるかに効率的です。 7. 単一テーブル クエリは、データ量が多い場合に、後でデータベースとテーブルを分割する場合に役立ちます。結合クエリを使用する場合は、データベースを分割したら、元の SQL を変更する必要があります。 8. 前回、CTO が自社の技術を共有しているのを見たとき、その会社では最下位レベルでの結合クエリは禁止されていると規定されていました。確かにデータが大きいと遅くなります。 9. 結合クエリは確かに高速ですが、MySQL リソースは通常、プログラム コード リソースよりもはるかに不足しています。 2. その他の回答仮説的なシナリオ: Web サイトに企業ライブラリ セクションがあり、特定の都市にあるすべての企業を検索したいとします。 データ テーブル: tbl_company (t1)、tbl_city (t2)。 例1:
例2: テーブル t1 には cityName が格納されます。ユーザーがフロントエンドで Shanghai をクリックすると、Shanghai の ID がバックエンドに渡されます (cityName の渡しは考慮されません)。
2 つの違い: 例 1 では 1 つのテーブル関連付けクエリのみが実行されますが、例 2 では 2 つの単一テーブルクエリが実行されます。 データ量が多いことを考慮すると、複数テーブル結合クエリはクエリ効率に影響するため、すべて単一テーブルクエリに最適化されます。 TP: 上記はインデックスを使用していない場合です どちらがより効率的でしょうか? 回答: SQL の最適化もビジネスに関係します。このステートメントのクエリは頻繁に行われるでしょうか? 2 つの接続によって生じるオーバーヘッドを考慮する必要がありますか? これらを考慮する必要がなく、インデックスがない場合、違いは大きくありません。2 は 1 よりわずかに優れているはずです。 データがそれほど大きくない場合は、カスケード クエリの方が高速です。 従来のデータベースの場合、データベースクエリの数を可能な限り減らします。 しかし、1. MySQL は接続/切断の処理や小さくて単純なクエリへの応答が非常に高速です。2. 今日のネットワークは非常に高速です。そのため、複数の小さなクエリの方が MySQL の方が高速になる可能性があります。 結局、マスターはどちらが優れているかについて結論を出していません。ハハ、実際、この本全体では、テスト! ベンチマーク! という 1 つの意味が明確に表現されています。自分のデータ環境で、両方の方法をテストしてください。データに語らせてください。 結論個人的には、単一テーブルクエリを使用することをお勧めします。アプリケーション層でデータを関連付けた方が良いでしょう。 上記はMySqlの単一テーブルクエリと複数テーブル接続クエリの効率性問題の詳細です。MySqlの単一テーブルと複数テーブル接続クエリの効率性の詳細については、123WORDPRESS.COMの他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
<<: HTMLセマンティクスと関連するフロントエンドフレームワークの詳細な分析
>>: Tomcatのクラスロードメカニズムのプロセスとソースコード分析
システム: Ubuntu 16.04LTS 1\公式サイトからmysql-5.7.18-linux-...
圧縮版の記事ではデータの初期化がされていないなどいくつか問題があったため、Windows にインスト...
ビュービューとは何ですか?ビューの役割は何ですか?ビューは仮想テーブルであり、データ自体を含まない論...
概要Prometheus は、HTTP プロトコルを介してリモート マシンからデータを収集し、ローカ...
<br />以下は開発中に遭遇した問題と、そこから得た経験です。デバッグに時間がかかりま...
目次1. 問題の説明: 2. Jenkins設定のトラブルシューティング3. コードログのエンコード...
独自のWebプロジェクトをtomcatディレクトリの下のwebappsディレクトリに配置します。 R...
このセクションでは、Web ページ内のテキストをスクロールしたり、スクロール プロパティを制御できる...
Vueでの監視方法時計知らせ名前: 監視する属性に同じ名前を付ける必要があります。 1. 機能Vue...
VMware ワークステーションの仮想マシンの互換性の問題を解決するにはどうすればよいですか?ノート...
スワップを無効にするサーバーがデータベース サービスまたはメッセージ ミドルウェア サービスを実行し...
目次導入ミラーリポジトリログイン引く押す検索ローカル画像管理画像rmiタグ建てる歴史保存負荷輸入コン...
世界で最も有名なウェブサイトのロゴデザインにはどんなフォントが使われているかご存知ですか?これらのフ...
この記事の例では、雨滴効果を実現するためのキャンバスの具体的なコードを参考までに共有しています。具体...
目次1. reduxとreactの関係2. Reactのマルチコンポーネント共有3. reduxの3...