MySQL の効率的なクエリの左結合とグループ化 (プラス インデックス)

MySQL の効率的なクエリの左結合とグループ化 (プラス インデックス)

mysql 効率的なクエリ

MySQL は、左結合の速度を上げるために group by を犠牲にします (インデックスが追加されていると仮定)。

ユーザーテーブル: 100,000 データ

例1: 約200秒

SELECT U.id, A.favorite_count FROM (SELECT id from user) U
左結合(
  -- いいねの数 SELECT favorite_by AS user_id, SUM(favorite_count) AS favorite_count
  お気に入りから
  お気に入り別にグループ化
) A ON U.id=A.user_id
左結合(
  -- コメント数 SELECT user_id, COUNT(*) AS comment_count
  photo_commentより
  ユーザーIDでグループ化
) B ON U.id=B.user_id

例2: 1秒以上

uf.user_id、uf.favorite_count、COUNT(pc.id) を comment_count として選択します (
u.id を user_id として選択し、SUM(f.favorite_count) を favorite_count として (SELECT id from user) u から選択します。 
LEFT JOIN お気に入り f on f.favorite_by = u.id  
u.id によるグループ化
) 
左結合 photo_comment pc on pc.user_id = uf.user_id
uf.user_id によるグループ化

付録: MySQL で 3 つのテーブルを効率的に結合する方法

次の3つのテーブルの結合ステートメント

*を選択 
t1から 
t2を(t1.a=t2.a)に結合する 
t3を(t2.b=t3.b)に結合する 
ただし、t1.c>=X、t2.c>=Y、t3.c>=Z です。

straight_join として書き直す場合、接続順序をどのように指定し、3 つのテーブルのインデックスをどのように作成すればよいでしょうか?

BKAアルゴリズムを使ってみる

BKA を使用する場合、「最初に 2 つのテーブルを結合した結果を計算し、次に 3 番目のテーブルと結合する」のではなく、クエリが直接ネストされます。具体的な実装: t1.c>=X、t2.c>=Y、t3.c>=Z の 3 つの条件のうち、フィルタリング後のデータが最も少ないテーブルを最初の駆動テーブルとして選択します。この時点で、次の 2 つの状況が発生する可能性があります。

テーブル t1 または t3 が選択された場合、残りは固定されます。

  • 駆動テーブルがt1の場合、接続順序はt1->t2->t3であり、駆動テーブルフィールドにインデックスを作成する必要があります。つまり、t2.aとt3.bにインデックスを作成します。
  • 駆動テーブルが t3 の場合、結合順序は t3->t2->t1 となり、t2.b と t1.a にインデックスを作成する必要があります。

同時に、最初の駆動テーブルのフィールド c にインデックスを作成する必要もあります。

2 番目のケースでは、選択された最初の駆動テーブルがテーブル t2 である場合、他の 2 つの条件のフィルタリング効果を評価する必要があります。

考え方としては、各結合に参加する駆動テーブルのデータ セットをできるだけ小さくすることです。これにより、駆動テーブルが小さくなります。

要約する

これで、MySQL の効率的なクエリの left join と group by に関するこの記事は終了です。MySQL の効率的なクエリに関する関連コンテンツをさらにご覧になりたい場合は、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続きご覧ください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQLがサブクエリと結合の使用を推奨しない理由
  • MySQL 結合クエリ構文と例
  • MySQL 結合テーブルクエリの基本操作 左結合のよくある落とし穴
  • MySQL におけるさまざまな一般的な結合テーブルクエリの例の概要
  • MySQLにおける(JOIN/ORDER BY)文のクエリ処理と最適化方法
  • MySQL結合クエリの原理

<<:  インタビュアーはCSSで固定アスペクト比を実現する方法を尋ねました

>>:  JavaScript で 2 次元配列を作成するためのヒント

推薦する

mysql-8.0.11-winx64.zip の詳細なインストール チュートリアル

zip インストール パッケージをダウンロードします。 MySQL8.0 For Windows z...

インターネットウェブデザインにおけるバイオニックデザインの簡単な紹介

バイオニックデザインといえば、飛行機の発明、ドバイのブルジュ・アル・アラブ、平泳ぎなどを思い浮かべる...

JavaScript の BigIn 関数の共通プロパティをまとめます

目次1. 概要2. 属性1. 数学演算子2. 比較演算子3. ブール演算結論1. 概要BigInt ...

純粋な HTML ページを送信し、パラメータを渡し、ID を確認する方法

プロジェクトにはアンケートが必要ですが、クライアントはアンケートのタイトルが純粋なHTMLタグでなけ...

MySQL 自動インクリメント ID 枯渇の例

ディスプレイ定義IDテーブルに定義された自動増分IDが上限に達した場合、次のIDを申請する際に得られ...

Tomcatの全体構造の簡単な紹介

Tomcat は Web コンテナとして広く知られています。Java を学び始めたときから現在の仕事...

WeChat パブリック アカウントの録音ファイルを再生して保存します (amr ファイルを mp3 に変換)

目次オーディオトランスコーディングツール原理JAVE プロジェクトの問題このプロジェクトの特徴拡張機...

JavaScript デザインパターン プロキシパターンの学習

目次概要実装保護エージェント仮想エージェント画像の遅延読み込みを実現する仮想プロキシ概要プロキシ パ...

MySQL 8.0の新機能、隠しフィールドの詳細な説明

序文MySQL バージョン 8.0.23 では、新しい機能「Invisible Column (In...

MySQL REVOKE でユーザー権限を削除する

MySQL では、REVOKE ステートメントを使用してユーザーの特定の権限を削除できます (ユーザ...

MySQL の垂直テーブルを水平テーブルに変換する方法と最適化のチュートリアル

1. 縦型テーブルと横型テーブル垂直テーブル: テーブル内のフィールドとフィールド値はキーと値の形式...

Vue3 トランジションアニメーションの落とし穴記録について

目次背景問題の場所さらなる分析要約する背景私のコース「Vue 3 エンタープライズレベルの音楽アプリ...

セマンティックタグを使用して、IE6、7、8と互換性のあるHTMLを記述します。

HTML5 では、ヘッダー、フッター、ナビゲーションなどのセマンティック タグが追加されているため...

Linuxで静的ネットワーク接続を構成する方法

Linux システムのネットワーク接続を構成するのは難しい場合があります。幸いなことに、多くの新しい...