2010-12-14 18 views
1

どのようにして、mysqlのタイムスタンプ列の日付部分でグループ化し、そのインデックスを利用できますか?あなたはしかし、このクエリはthetimeにインデックスを使用することはできませんタイムスタンプの日付別グループ

select date(thetime) from mytable group by date(thetime) 

のようなソリューションを使用することができますが、あなたがでグループ化する前に、機能を使用して列を変換しているよう代わりに一時テーブルが必要になります。もちろん、

それ。

+----+-------------+-------------+-------+---------------+-------------+---------+------+-------+----------------------------------------------+ 
| id | select_type | table  | type | possible_keys | key   | key_len | ref | rows | Extra          | 
+----+-------------+-------------+-------+---------------+-------------+---------+------+-------+----------------------------------------------+ 
| 1 | SIMPLE  | mytable  | index | NULL   | thetime  | 4  | NULL | 48183 | Using index; Using temporary; Using filesort | 
+----+-------------+-------------+-------+---------------+-------------+---------+------+-------+----------------------------------------------+ 

理論的には、その列のインデックスに対してレンジスキャンを使用できず、一時テーブルを必要としない理由はありません。それを行うためにクエリを実行するようにクエリオプティマイザを説得できる構文はありますか?

答えて

1

私はデータベースがすでにあなたが望むことを理解することができますから? xplanに明白なように、インデックスは(テーブル自体ではなく)スキャンされています。

しかし、グループ化(個別)操作中に日付を保持するために中間テーブルが必要であるという事実を回避することはできません。

+0

関数を使用してインデックスを変更しない場合は、インデックス付きカラムでgroup byを実行するために一時テーブルは必要ありません。時間部分を切り捨てる関数ではなく演算子があれば、それはうまくいくかもしれません –

+0

@x:うーん、私たちはどちらも正しいと思います。集計関数が適用されていない限り、(理論的に)以前に出力された値のみを保持しながら歩くことによって、異なる値のリストを得ることができます。カウント/合計などを実行するときは、グループ化操作の終了まですべての値を維持する必要があります。問題は、これがデータベースに実装されているかどうかです。 :) – Ronnis

関連する問題