読者です 読者をやめる 読者になる 読者になる

そーす

福岡在住のプログラマ

不要なCOUNT関数を追加すると何故か高速化するSELECT

最近データ分析をやることが多くSQLばっかり書いてます。

といってもSQLとかDBに関する知識はMAX100とすると私は「2」くらいです。

なので、色々と躓きます。

昨日もちょっとわからないことがありました。

例えば、日毎の累計ユーザが欲しい場合のクエリは

SELECT date(created_at) AS created_on,
  (SELECT count(*)
   FROM users
   WHERE date(created_at) <= created_on) AS COUNT
FROM users t
WHERE t.created_at >= date_sub(CURRENT_DATE, interval 7 DAY)
GROUP BY created_on
ORDER BY created_on DESC

こんな感じになるかと思います。

これは最近の1週間分なんですが、コレだとめちゃくちゃ遅いです。

サブクエリでも毎回集計してるから遅いのは仕方ないとは思うのですが、

このSELECTに

COUNT(*) AS today_count,

というのを追加して

SELECT date(created_at) AS created_on,
       COUNT(*) AS today_count,

  (SELECT count(*)
   FROM tokopay_users
   WHERE date(created_at) <= created_on) AS COUNT
FROM tokopay_users t
WHERE t.created_at >= date_sub(CURRENT_DATE, interval 7 DAY)
GROUP BY created_on
ORDER BY created_on DESC

とすると、何故か爆速になりました。

私には全く理由がわかりません。

誰か教えて欲しい。