2016-11-29 29 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及更高版本中可用。