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 次元配列を作成するためのヒント

推薦する

CSSアニメーション属性キーフレームの詳細な説明

コラムを更新してからどれくらい経ったでしょうか?半年ですか?今年の後半は、まさに離陸、つまり文字通り...

CSSをインポートする方法に関する詳細な洞察の要約

CSS の開発履歴についてはここでは紹介しません。ブログを書いている理由の 1 つは、フロントエンド...

H5ゲームをnginxサーバーにデプロイする方法の詳細な説明

自己学習型ゲーム開発の道において、最も充実した瞬間は、自分でミニゲームを作り、友達と共有して試しにプ...

Windows で Mysql を起動したときに 1067 が表示される場合の解決策

数日前に仕事を始めて、Mysql をインストールしたところ、開くことができました。今日、会社に行った...

クリックイメージ反転効果を実現するJavaScript

最近、顔コレクションに関するプロジェクトに取り組んでいましたが、フロントエンドモジュールを書いている...

js配列の基本的な使い方のまとめ

序文配列は特別な種類のオブジェクトです。 js には実際の配列はなく、オブジェクトを使用して配列をシ...

Reactベースのコンポーネントのカプセル化の実装手順

目次序文antd はどのようにしてコンポーネントをカプセル化するのでしょうか?ディバイダーコンポーネ...

js 正規表現の先読みと後読み、および非キャプチャグループ化

目次先読みと後読みをキャプチャグループと組み合わせる捕獲グループと非捕獲グループ前を向いて、後ろを振...

ネイティブ JavaScript を使用した Web 計算機の実装

この記事では、参考までに、計算機のWebバージョンを実装するためのJavaScriptの具体的なコー...

Docker を使用して Spring Boot をデプロイする方法の例

ここでは主に、スタンドアロンのプログラムを生成できるspring-bootと、Mavenプラグインd...

CSS を使用して ul と li の水平配置を実現する 2 つの方法

li はブロックレベル要素であり、デフォルトで 1 行を占めるため、水平方向の配置を実現する場合は、...

テーブルタグ(テーブル)詳細

<br />テーブルは、昔から誰もが使ってきたタグで、今も使われています。しかし、現在の...

ubuntu15.10 での hadoop2.7.2 の詳細なインストールと設定

Linux での Hadoop インストール チュートリアルはインターネットや書籍に多数ありますが、...