注意:我發現this similar question但它沒有解決我的問題,所以我不認爲這是重複的。我有兩個簡單的MySQL表(使用MyISAM引擎創建),Table1
和Table2
。我有兩個簡單的MySQL表(使用MyISAM引擎創建),Table1
和Table2
。MySQL加入日期列與1個月的滯後和性能問題
這兩個表都有3列,日期類型列,整數ID列和浮點值列。這兩張表格都有大約300萬條記錄,而且非常簡單。
的表的內容如下所示(與Date
和Id
作爲主鍵):
Date Id Var1
2012-1-27 1 0.1
2012-1-27 2 0.5
2012-2-28 1 0.6
2012-2-28 2 0.7
(假設Var1
變得Var2
用於第二表)。
請注意,對於每個(年,月,ID)三元組,只會有一個條目。但是,出現月份的實際一天並不一定是最後一天,也不是最後一個工作日,也不是最後一個工作日,等等。這只是一個月中的某一天。這一天作爲其他表格中的觀察日很重要,但在Table1
和Table2
之間的月份本身並不重要。
因此,我不能依靠Date + INTERVAL 1 MONTH
生成匹配的日期,以便匹配日期與未來的一個月。
我期待加入這兩個表上Date
和Id
但如果從第二個表(Var2
)的值來自1個月的領先比Var1
。
這種代碼將完成它,但我注意到這一點顯着的性能下降,下面解釋。
-- This is exceptionally slow for me
SELECT b.Date,
b.Id,
a.Var1,
b.Var2
FROM Table1 a
JOIN Table2 b
ON a.Id = b.Id
AND YEAR(a.Date + INTERVAL 1 MONTH) = YEAR(b.Date)
AND MONTH(a.Date + INTERVAL 1 MONTH) = MONTH(b.Date)
-- This returns quickly, but if I use it as a sub-query
-- then the parent query is very slow.
SELECT Date + INTERVAL 1 MONTH as FutureDate,
Id,
Var1
FROM Table1
-- That is, the above is fast, but this is super slow:
select b.Date,
b.Id,
a.Var1,
b.Var2
FROM (SELECT Date + INTERVAL 1 MONTH as FutureDate
Id,
Var1
FROM Table1) a
JOIN Table2 b
ON YEAR(a.FutureDate) = YEAR(b.Date)
AND MONTH(a.FutureDate) = MONTH(b.Date)
AND a.Id = b.Id
我試圖重新排序JOIN
標準,想也許在Id
第一代碼會改變查詢執行計劃是匹配的,但它似乎沒有什麼區別。
當我說「超級慢」時,我的意思是,即使我等了一個多小時,上述代碼中的選項#1也不會返回所有300萬條記錄的結果。選項#2在不到10分鐘內返回,但選項3再次超過1小時。
我不明白爲什麼引入日期滯後使得花費這麼長時間。
我
- 如何可以分析查詢以瞭解爲什麼它需要很長的時間?
- 基於1個月的日期滯後(其中由1個月的滯後導致的月份日可能導致不匹配)爲聯接表編寫更好的查詢。
如何創建和索引'dateYear'和'dateMonth'列(作爲整數)?我相信什麼會影響你的表現是使用'YEAR'和'MONTH'功能。 –
這可以工作,但理想情況下,我不想在任何地方傳播它。實際上有數百個像Table1和Table2這樣的表,需要進行這個過程。我想我可以嘗試一個子查詢,它返回一個等於'FutureDate'的'100 * Year + Month'的列(在我的第二個示例中),並查看該子查詢在父查詢中是否更快,因爲連接只會在整數列上。 – ely
您是否找到解決方案?使用YEAR()和MONTH()條件時,我遇到了緩慢連接的類似問題。 –