按日期加入时查询速度慢(日历表)

时间:2016-11-29 14:04:59

标签: mysql

我正在尝试实施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。但我不喜欢这个解决方案,因为我需要timestamp列。还有其他方法来处理这种情况吗?

基本上这是一个着名的问题,当你得到一些日期的统计数据,你需要用零填充日期空白。所以也许值得尝试在PHP中处理这个......

2 个答案:

答案 0 :(得分:2)

您可以使用生成的列存储created_at列的日期组件:

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

然后您可以像往常一样在此列上JOIN

请注意,MySQL 5.7.5及更高版本中提供了生成的列。

答案 1 :(得分: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))