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が正常にインストールされたかどうかを確認する方法

MySQL をインストールした後、DOS ウィンドウまたは MySQL 5.7 コマンドライン クラ...

Ubuntu 18.04 に Anaconda3 をインストールするための詳細なチュートリアル

Anaconda は、conda、Python、およびそれらの依存関係など、180 を超える科学パッ...

CSS 属性値 clear:right が機能しない理由の詳細

clear プロパティを使用してフロートをクリアすることはよくあることであり、clear プロパティ...

JavaScript フロー制御 (ループ)

目次1. forループ2. 二重の for ループ3. whileループ4. dowhileループ5...

MySQL サービスとデータベース管理

目次1. サービスの開始と停止の手順1.1 Windows での MySQL 5.7 の公式 MSI...

CSV、Excel、SQL ファイルを MySQL にインポートするためのヒント

1. csvファイルをインポートする次のコマンドを使用します。 1.mysql> infile...

VMware 仮想マシンでの Centos8 ブリッジの静的 IP 設定方法

1. ネットワーク接続方法がブリッジされていることを確認する物理ネットワーク接続ステータスのコピーを...

Linux システムで MySQL の文字セットを UTF8 に変更する手順

目次1. データベース内の MySQL ステータスを確認します。 2. 設定ファイルを変更します。 ...

WiFi 開発 | WiFi ワイヤレス テクノロジーの紹介

目次WiFiワイヤレステクノロジーの紹介1. WiFiテクノロジーの概要2. ESP8266の紹介W...

Linux で MySQL 8.0 サービスを完全に削除する方法

この記事を読む前に、Linuxコマンド、特にcentos7.3環境でyumを使用してインストールされ...

MySQL で主キーと ROWID を使用する際の落とし穴の概要

序文MySQL の rowid の概念については聞いたことがあるかもしれませんが、テストや実践が難し...

Nginx 仮想ホスト (IP ベース) を構成する 3 つの方法の詳細な説明

Nginx は、IP ベースの仮想ホスト構成、ポート ベースの仮想ホスト構成、ドメイン名ベースの仮想...

Bootstrap3.0 学習ノートテーブル関連

この記事では、Webサイトを作ったことがある人にとっては馴染みのあるテーブルについて主に説明します。...

HTML ウェブページハイパーリンクタグ

HTML ウェブ ページのハイパーリンク タグの学習チュートリアル リンク タグの属性 リンクは、ウ...