[mysql]集合差を求める場合の処理速度比較(NOT IN(), NOT EXISTS, LEFT JOIN … IS NULL)
http://qiita.com/Hiraku/items/71873bf31e503eb1b4e1
こういう所とか
http://rzpg.blogspot.jp/2011/02/mysqlnot-innot-exists.html
こういう所で、集合差をとる場合(Aの集合には存在しないレコードをとると。)の処理のパターンが紹介されており、
それぞれ速度差があるということで、手元で試してみた。
状況として、「当月のアクティブユーザーで、先月アクセスしていないユーザー」というイメージ
※いちおうキャッシュしないように「SQL_NO_CACHE」で。。
結果
NOT IN 14.96秒
NOT EXISTS 11.76 秒
LEFT JOIN 5.05 秒
LEFT JOIN に対し、NOT EXISTS は2倍 、NOT IN は3倍という感じ。
LEFT JOIN is NULLがとりあえずの手という所でしょうか。
参考 SQL
NOT IN(…):
1 2 3 4 5 6 7 |
SELECT SQL_NO_CACHE count(*) AS count FROM members WHERE date BETWEEN '2017-06-01' AND '2017-06-30' AND member NOT IN ( SELECT member FROM members WHERE date BETWEEN '2017-05-01' AND '2017-05-31' ); |
NOT EXISTS(….),
1 2 3 4 5 6 7 8 9 10 11 |
SELECT SQL_NO_CACHE count(*) AS count FROM members this WHERE NOT EXISTS ( SELECT member FROM members past WHERE this.member = past.member AND date BETWEEN '2017-05-01' AND '2017-05-30' ) AND date BETWEEN '2017-06-01' AND '2017-06-02' ; |
LEFT JOIN … IS NULL
1 2 3 4 5 6 7 8 9 |
SELECT SQL_NO_CACHE count(*) AS count FROM members this LEFT JOIN ( SELECT member FROM members WHERE date BETWEEN '2017-05-01' AND '2017-05-30' ) pre ON this.member = pre.member WHERE date BETWEEN '2017-06-01' AND '2017-06-02' AND pre.member IS NULL; |
関連記事
-
-
[mysql][db]データ増大に伴う、データ表示処理・データ蓄積処理の変更履歴…
背景 ログの蓄積について、とりあえずでやっていたら処理がドンドンおもくなっていき …
-
-
[mysql]どういうSQL文のとき、どういうインデックスが使われるのか整理
mysqlのチューニングをしていて、どうしてもインデックスが、どの指定の時に何が …
-
-
[sql][mysql]URLのパラーメータ削除 + index.html の 削除
よく忘れるのでメモ。 ログを集計するときに、パラメータを削除したり、URLの/と …
-
-
[mysql]なぜかindexが使われない、、、クォーテーションで囲っている?
whereの対象列にindexを張っている。 しかし、検索時にやたら重いことがあ …
-
-
xamppの旧バージョンダウンロード
案件ごとにいろんなphp apacheのバージョンを組み合わせるのが面倒臭い。 …