3

インデックスを使用する必要があると思っていた 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、deviceidにインデックスが設定されています。ただし、このクエリの Explain の結果は次のようになります。

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 レコードの行の総数はわずか184085であるため、クエリは結果セットを取得するためだけにすべての行を調べているようです。Broadcast_at のインデックスが機能していません。

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

4

1 に答える 1

4

broadcast_atそのフィールドで関数を使用する場合、MySQL はインデックスを利用できないと思います。

次の場合、どのように機能しますか。

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;
于 2012-05-07T10:24:25.087 に答える