1

これはSOでの私の最初の質問です

私は::であるクエリを使用しています

SELECT   column1, column2, COUNT(*) 
FROM     myTable 
GROUP BY DATE(logged_date) 
HAVING   COUNT(*)>10

Mytable には 200 万件のレコードが含まれており、logged_date 列の型は datetime です。

上記のクエリは、実行に約 15 秒かかります。

どんな助けでも大歓迎です。

4

2 に答える 2

2

いらっしゃいませ。テーブル スキーマも提供することをお勧めします。それにもかかわらず、私はいくつかの推測をします:

Logged_date は TIMESTAMP 列または DATATIME です -- そうですか? これが、その列で DATE() を実行する理由です。

これが最適化したいクエリである場合の最良のオプションは、別の列を追加することですlogged_date_day(最初の名前はすでに混乱していますが、2番目の名前は同じです:))

これは、両方を同時にサポートすることを意味します (しかし、私の次の推測では、INSERT1 つだけであり、再度更新されることはありません。したがって、これはそれほど大きな労力ではありません)。

次に、新しい列にインデックスを付け、その列で を実行する必要がありGROUP BYます。

PS

技術的に言えば、SELECT column1 FROM some_table GROUP BY another_column有効なクエリではありません。sql_modeにONLY_FULL_GROUP_BYが含まれていない場合、MySQL はそれを許可します。これを調べることをお勧めします。

于 2012-07-15T07:02:10.377 に答える
0

また、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
于 2012-07-15T07:45:05.033 に答える