2011-08-31 84 views
1

假設我有一個DATETIME列approve_time的'Tasks'表。我在這個專欄上有一個索引。MYSQL的性能WHERE DATE(time)='yyyy-mm-dd'

如果我寫形式的查詢:

SELECT task_id, task_desc, task_owner, approve_time 
    FROM Tasks 
WHERE DATE(approve_time) = '2011-08-31' 

我的問題是這樣一個查詢的性能:

是否在允許被約束的方式MySQL索引的DATETIME列日期組件要快?

或者MYSQL知道如何將查詢優化爲如下所示?

WHERE approve_time >= '2011-08-31 00:00:00' 
    AND approve_time < '2011-09-01 00:00:00' 

或者查詢是否產生桌面掃描?

+1

您可以省略第二個查詢中的時間部分('approve_time> ='2011-08 -31'')。在這種情況下,它仍然會使用索引。 – a1ex07

+0

請注意,您可以將'WHERE approve_time> ='2011-08-31 00:00:00' AND approve_time <'2011-09-01 00:00:00''改寫爲'WHERE approve_time BETWEEN'2011-08-31 00:00:00'AND'2011-08-31 23:59:59'' – Johan

回答

3

是否允許MYSQL索引DATETIME列允許通過日期組件快速約束?

NO

抑或MYSQL知道如何查詢優化成類似下面的?

YES


第二查詢將導致範圍濾波器,
嘗試

explain extended query_1; <--- number of rows sent for scan is more, 
           which should be aLL rows 

VS

explain extended query_2; 

DATE(approve_time)的值只能在函數應用於所有行的列approve_time之後確定,這意味着將不會使用索引

+1

謝謝你教我如何釣魚。 –

+0

要清楚,優化器不知道如何將query_1轉換爲query_2,對嗎? –

+0

是的,因爲日期函數的結果尚未確定 – ajreal