[英]Slow query when joining by date (calendar table)
我正在嘗試實施此解決方案 。
我有聯系人和日歷表。 聯系人的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
列分為兩列: date
和time
。 但是我不喜歡這種解決方案,因為我需要時間戳列。 還有其他方法可以處理這種情況嗎?
基本上,這是一個著名的問題,當您獲得一些帶有日期的統計信息並且您需要用零填充日期間隔時。 因此,也許值得嘗試用PHP處理此問題...
您可以使用生成的列來存儲created_at
列的日期部分:
ALTER TABLE contacts
ADD created_at_date AS (date(created_at)) STORED;
然后,您可以照常在此列上JOIN
。
注意,生成的列在MySQL 5.7.5及更高版本中可用。
我猜您在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))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.