2016-11-29 25 views
1

我試圖實施this solution按日期加入時的慢查詢(日曆表)

我有聯繫人和日曆表。聯繫人有created_at時間戳列,日曆有date列即日期。

所以查詢:

select contacts.id, calendar.date 
from contacts 
right join calendar on date(contacts.created_at) = calendar.date 

永遠不會完成。

我讀過date(contacts.created_at)減慢它,其中一個可能的解決方案是將created_at列分成兩列:datetime。但我不喜歡這個解決方案,因爲我需要時間戳列。有沒有其他辦法來處理這種情況?

基本上這是着名的問題,當你得到一些日期的統計信息,你需要用零填充日期差距。因此,也許值得一試來處理這個在PHP ...

回答

0

我猜你created_at有索引,但您使用的那一刻date()優化,因爲是不同的字段不能使用該索引。

因此是更好,如果你創建接觸的日期列,而不是你能指標

或改爲嘗試:

select contacts.id, calendar.date 
from contacts 
right join calendar 
    on contacts.created_at >= calendar.date 
    and contacts.created_at < DATE(DATE_ADD(calendar.date, INTERVAL -1 DAY)) 
2

您可以使用生成的列來存儲created_at列的日期部分:

ALTER TABLE contacts 
ADD created_at_date AS (date(created_at)) STORED; 

然後您可以像往常一樣在此列上JOIN

請注意,生成的列在MySQL 5.7.5及更高版本中可用。