簡體   English   中英

MySQL查詢在where子句中花費很長時間

[英]MySQL query take so long time in where clause

我有像下面這樣的表結構:

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    

嘗試添加復合索引: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

嘗試這個。 我敢打賭它運行得更快。 在日期上使用函數時,引擎通常會忽略索引。 將范圍直接與日期字段進行比較應該更快。

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

需要很長時間嗎? 兩個可能的原因。 一種是該表正在執行全表掃描(因為where子句中的功能排除了使用索引)。 另一個是因為有很多行。

JW的解決方案解決了第一個問題:

WHERE   created >= '2013-07-05' AND
        created < '2013-07-05' + INTERVAL 1 DAY

沒有功能的直接比較應始終使用索引。

因為這不是問題,所以讓我假設一天中有很多行。 如果是這樣,那么問題就是索引可能發生的顛簸。 這基本上意味着每個匹配的引用都在不同的頁面上,因此您仍然必須閱讀大量頁面。 解決此問題的方法是將item_id添加到索引中。 create table語句中,您將執行以下操作:

index (created, item_id)

或者,您可以這樣做:

create index stats_item_created_item_id on stats_item(created, item_id)

在表stats_item中,確實有很多行。 我嘗試將INDEX與創建的item_id添加在一起,結果仍然很慢。

我使用的唯一方法是之間。 最好只花0.0686秒,與4.1747秒相差甚遠

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM