0

私は以下のようなテーブル構造を持っています:

id item_id created
1  5       2012-09-05 09:37:59
2  5       2012-09-05 10:25:09
3  5       2012-09-05 11:05:09
4  1       2012-09-05 10:25:09
5  3       2012-09-05 03:05:01

次のようにWHERE句を使用して現在の日付を渡すことで、どのitem_idが最も多く表示されるかを知りたい:

SELECT item_id, COUNT( id ) AS TOTAL
FROM stats_item
WHERE DAY( created ) =  '05'
AND MONTH( created ) =  '07'
AND YEAR( created ) =  '2013'
GROUP BY item_id
ORDER BY TOTAL DESC 
LIMIT 0 , 30

MySql の結果クエリ

Showing rows 0 - 29 ( 30 total, Query took 4.1747 sec)

最大4.1747秒かかります

以下は表のインデックスです

Table        Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
stats_item   0          PRIMARY  1            id          A         2575580     NULL     NULL         BTREE
stats_item   1          created  1            created     A          515116     NULL     NULL   YES   BTREE

WHERE 句を使用したクエリと、YEAR、MONTH、DAY を使用したフィルターでクエリに時間がかかるのはなぜですか?

================================== EXPLAINで編集:

Field   Type                Null Key    Default Extra
id      int(11) unsigned    NO   PRI    NULL    auto_increment
item_id int(11) unsigned    YES         NULL    
created timestamp           YES  MUL    NULL    
4

4 に答える 4

0

複合インデックスを追加してみてください: created+item_id 次
のようなクエリを使用してみてください:

SELECT item_id, COUNT( id ) AS TOTAL FROM stats_item
WHERE created >= "2013-07-05" and created <= "2013-07-05 23:59:59" 
GROUP BY item_id ORDER BY TOTAL DESC LIMIT 0 , 30
于 2013-07-04T02:25:33.297 に答える
0

これを試して。きっと速く走れます。日付に対して関数を使用する場合、エンジンは通常、インデックスを無視します。範囲を日付フィールドと直接比較すると、より速くなります。

SELECT   item_id, COUNT( id ) AS TOTAL
FROM     stats_item
WHERE    created BETWEEN '2013-05-07' AND '2013-05-07 23:59:59'
GROUP BY item_id
ORDER BY TOTAL DESC 
LIMIT 0, 30
于 2013-07-04T02:25:41.370 に答える