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

推薦する

HTML のスクロールバーについて/スクロールバーの削除

1. xhtmlの下のスクロールバーの色元の HTML では、ページ全体のスクロール バーを次のよう...

CentOSにPHP+Apache+MySQLのサーバー環境をインストールして構築する

Yum (フルネームは Yellow dog Updater, Modified) は、Fedora...

CSS3 でテキスト ストロークを実装する 2 つの方法 (要約)

質問最近、以下に示すように、テキストストローク効果を実現するという要件に遭遇しました。 解決策1まず...

きちんとした標準的なHTMLタグの書き方を学ぶ

優れた HTML コードは美しい Web サイトの基礎となります。私が CSS を教えるときは、まず...

リンクされた画像をダウンロードしてアップロードするJavaScriptの実装

写真をアップロードするので、まずはダウンロード可能な画像リソースかどうかを判断する必要があります。正...

Vue 大画面データ表示例

効率的に要件を満たし、コンポーネント ライブラリの肥大化や車輪の再発明を避けるために、私は以前、大画...

セマフォによるTomcatの異常終了の解決方法

最近はビッグデータで遊んでいます。友人が私のところに来て、オンラインの Tomcat が不可解に終了...

開発者にとって必須の Docker コマンドの概要

目次Docker入門Docker環境のインストールDockerイメージの共通コマンド検索ミラー画像を...

XHTML CSS ウェブサイトデザインの利点と問題点

XHTML は現在国際的に推奨されている標準的な Web サイト設計言語です。Webjx.com も...

CSS ブラウザ互換性の問題に対する 4 つの解決策

フロントエンドは、技術が急速に進化するだけでなく、知っておくべき事柄が多すぎるという理由で大変な仕事...

CSS リセットスタイルリセットの実装例

はじめに: すべてのブラウザには、「ユーザー エージェント スタイル シート」と呼ばれる、すべてのペ...

Alibaba Cloud Centos7.3 インストール mysql5.7.18 rpm インストール チュートリアル

MariaDBをアンインストールするCentOS7 ではデフォルトで MySQL の代わりに Mar...

CocosCreator ScrollView 最適化シリーズ: フレーム読み込み

目次1. はじめに2. 行き詰まった問題の分析3. 解決策(理論) 4. ソリューション(コード) ...

MySQL で指定した桁数の乱数を生成する方法と、バッチで乱数を生成する方法

1. まず、よく使われるMySQL関数をいくつか紹介しますRAND() は 0 から 1 (0<...

SSMは、mysqlデータベースアカウントのパスワード暗号文ログイン機能を実装します。

導入当社は、情報セキュリティと機密アプリケーションに関わるいくつかのプロジェクトの研究開発に従事して...