これはSOでの私の最初の質問です
私は::であるクエリを使用しています
SELECT column1, column2, COUNT(*)
FROM myTable
GROUP BY DATE(logged_date)
HAVING COUNT(*)>10
Mytable には 200 万件のレコードが含まれており、logged_date 列の型は datetime です。
上記のクエリは、実行に約 15 秒かかります。
どんな助けでも大歓迎です。
これはSOでの私の最初の質問です
私は::であるクエリを使用しています
SELECT column1, column2, COUNT(*)
FROM myTable
GROUP BY DATE(logged_date)
HAVING COUNT(*)>10
Mytable には 200 万件のレコードが含まれており、logged_date 列の型は datetime です。
上記のクエリは、実行に約 15 秒かかります。
どんな助けでも大歓迎です。
いらっしゃいませ。テーブル スキーマも提供することをお勧めします。それにもかかわらず、私はいくつかの推測をします:
Logged_date は TIMESTAMP 列または DATATIME です -- そうですか? これが、その列で DATE() を実行する理由です。
これが最適化したいクエリである場合の最良のオプションは、別の列を追加することですlogged_date_day
(最初の名前はすでに混乱していますが、2番目の名前は同じです:))
これは、両方を同時にサポートすることを意味します (しかし、私の次の推測では、INSERT
1 つだけであり、再度更新されることはありません。したがって、これはそれほど大きな労力ではありません)。
次に、新しい列にインデックスを付け、その列で を実行する必要がありGROUP BY
ます。
PS
技術的に言えば、SELECT column1 FROM some_table GROUP BY another_column
有効なクエリではありません。sql_modeにONLY_FULL_GROUP_BYが含まれていない場合、MySQL はそれを許可します。これを調べることをお勧めします。
また、logged_date でグループ化することも心配していますが、column1 と 2 を表示すると、期待した結果が得られない可能性があるため、すべての列でグループ化するか、column1 と 2 の周りに max や min などの関数を使用することをお勧めします
それにもかかわらず、次のようなことを考えるかもしれません:
group by 内のすべてが一緒にキー付けされていることを確認してください。
alter table myTable add key (logged_date (10), column1,column2);
変更されたクエリ:
SELECT left(logged_date,10) as ldate , column1, column2, COUNT(*)
FROM myTable
GROUP BY ldate,column1,column2
HAVING COUNT(*)>10