- 締切済み
テーブルの結合について
以下の二つを実行すると、2 の方がかなり速いのですが理由が分かりません。 分かる方教えてもらっていいですか? DBはMYSQLでInoDBです。 ちなみに Aは1万件、B は10万件ほど 1 のSQL SELECT * FROM A LEFT JOIN (SELECT * FROM B WHERE ・・・ GROUP BY XXX) B ON A.id = B.XXX WHERE ・・・ GROUP BY A.id 2 のSQL (SELECT * FROM A ・・・ GROUP BY ID ) A LEFT JOIN (SELECT * FROM B WHERE ・・・ GROUP BY XXX) ON A.ID = B.XXX.ID
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- Siegrune
- ベストアンサー率35% (316/895)
(SELECT * FROM A ・・・ GROUP BY ID ) と (SELECT * FROM B WHERE ・・・ GROUP BY XXX) の結果は何件なのでしょうか? それぞれ、100件、50件と仮にすると、 Aは1万件、B は10万件なので、 1 のSQLは、1万件と50件を結合して、それをIDでgroup byしている。 2 のSQLは、1万件からIDでgroup byした結果の100件と50件を結合している。 AもBもインデックスが絡んでいないとすると、 1万件と50件を結合する速度と100件と50件を結合する速度の差では? IDにインデックスがはってあれば、 (ID,x,y,z等の先頭にIDがある複合したインデックスでもいいですが) 2 のSQLは、1万件からIDでgroup byするのにインデックスを利用できるので 1 のSQLの結合結果をgroup byするときにインデックスが利用できないのに比べて早くなる。
- nora1962
- ベストアンサー率60% (431/717)
LEFT JOINでサブクエリを用いるので結合に索引は使用されない。 Aの件数がn1、2のサブクエリで集計した件数をn2、Bのサブクエリ集計後の件数をmとすると ネステッドループで1はn1×m回、2はn2×m回の結合が行われる。 join_buffer_sizeにもよるが件数が多いとテンポラリテーブル(orファイル)を使用するようになるので2が遅くなる。