2016-02-04 87 views
0

嘿傢伙我有一個關於sql性能的快速問題。我有一個非常非常大的表,它永遠運行下面的查詢,請注意,有一個與時間戳列mysql tunning時間戳性能?

select name,emails, 
    count(*) as cnt 
from table 
where date(timestamp) between '2016-01-20' and '2016-02-3' 
and name is not null 
group by 1,2; 

所以,我的朋友建議使用下面這個查詢:

select name,emails, 
    count(*) as cnt 
from table 
where timestamp between date_sub(curdate(), interval 14 day) 
and date_add(curdate(), interval 1 day)  
and name is not null 
group by 1,2; 

而且這需要更少的時間來運行。爲什麼?這兩個時間函數有什麼區別? 還有另一種更快的運行方式嗎?像索引?有人可以向我解釋mysql如何運行?非常感謝!

+2

在我的文章中也包含了對這兩個查詢的解釋以及對於這些問題的創建表語句 – Shadow

+0

檢查原因... –

回答

1

只需添加上timestamp場指數和使用查詢按如下─

select name,emails, 
    count(*) as cnt 
from table 
where `timestamp` between '2016-01-20 00:00:00' and '2016-02-03 23:59:59' 
and name is not null 
group by 1,2; 

爲什麼?這兩個時間函數有什麼區別

在第一個查詢中,您從自己的列中獲取日期,但使用date()函數由於這個原因,mysql沒有使用索引並進行表掃描,而第二個建議的表已被刪除date(timestamp)函數,所以現在mysql會檢查索引中的值而不是表掃描,因此速度很快。

相同的mysql也會在我的表中使用索引。