2012-05-07 10 views
3

私は私のインデックスを使用する必要がありますが、まだ多くの行をスキャンする必要があるようだと思うmysqlクエリがあります(私は思う)。ここで可能であれば、このmysqlクエリを最適化してインデックスを使用しますか?

は私のクエリです:

SELECT DISTINCT DAY(broadcast_at) AS 'days' 
from v3211062009 
where month(broadcast_at) = 5 and 
year(broadcast_at) = 2012 
and deviceid = 337 order by days; 

私のテーブルの上に私はbroadcast_atとデバイスにインデックスを設定しています。しかし、このクエリに説明の結果は次のようになります。それは、行の多くをルックアップするために必要とする理由

id select_type table type possible_keys key key_len ref rows Extra 
1 SIMPLE v3211062009 ref indx_deviceid,indx_tracking_query indx_tracking_query 4 const **172958** Using where; Using index; Using temporary; Using filesort 

私は理解していません。このdeviceidレコードの行の総量はなので、私のクエリは結果セットを得るためにほとんどすべてを見ているようです。 broadcast_atの索引は機能していません。

私は明らかに何か根本的に間違っていますが、それを理解できません。インデックス内の列の順序を変更しても機能しませんでした。

答えて

4

フィールドに関数を使用すると、MySQLがインデックスbroadcast_atを利用できるとは思われません。あなたがしなければ、それは実行しない方法

SELECT DISTINCT DAY(broadcast_at) AS 'days' 
from v3211062009 
where broadcast_at >= ('2012-05-01') AND 
     broadcast_at < ('2012-06-01') 
and deviceid = 337 order by days; 
+2

はい、と '(DeviceIDは、broadcast_at)'上のインデックスと、それはそう@ypercube –

+0

元のクエリよりもはるかに高速になり、実際にそれが必要さあ。 – Alnitak

+0

@Alnitak oはい。これはトリックを行い、行を11Kのルックアップに調整したようです。もっと良いおかげで。 – dreza