-2
我一直查詢表700萬行和數百列,並通過下面的查詢在MySQL返回20秒內結果速度由MySQL通過索引
SELECT r.wgt, r.yyyymm, s.fpeDate, s.fileDate, s.stockID, s.endDate, s.Var1, s.Var2, s.Var3
FROM tableA AS r
INNER JOIN tableB AS s ON s.fpeDate >= 201212 AND s.fpeDate <= 201412 AND s.fileDate <20141201 AND s.stockID = r.stockID AND r.yyyymm = 201412;
然而,當我apppend一個百萬行至該表,使用相同的查詢,我得到了60秒左右的結果。我有另外20百萬行附加到它。
我爲tableB創建了3列fpeDate,fileDate,stockID的索引,以使它們唯一,以便在追加過程中忽略任何重疊數據。
ALTER TABLE tableA
ADD CONSTRAINT uniqueKeys unique INDEX (yyyymm, stockID);
ALTER TABLE tableB
ADD CONSTRAINT uniqueKeys unique INDEX (fpeDate, fileDate, stockID);
當我使用EXPLAIN時,它正在掃描所有的行。你有什麼想法,我怎樣才能讓它更快?
我使用EXPLAIN
ID select_type table partitions type possible keys key ref rows filtered ext
1 SIMPLE s null ALL uniqueKeys null null null 7132508 17.21 Using where
1 SIMPLE r null ref uniqueKeys uniqueKeys 38 const,r.stockid 1 100.00
- 我已經取代了 「內部連接」 與 「STRAIGHT_JOIN」。它更糟糕。 Mysql優化了查詢。
- 列中有空值。我無法給它一個價值,因爲空值意味着缺少價值,這意味着當時公司並沒有提供相應的價值。
- 我已經厭倦了爲tableB中的所有「選定變量」創建索引並運行查詢。它非常快。
在tableB上創建索引my_id1(fpeDate,fileDate,stockID,endDate,Var1,Var2,Var3);
如果我創建一個索引,如下所示,查詢時間變得很長。
create index my_id1 on tableB (fpeDate, fileDate, stockID);
現在的問題:
我不能TableB中具有幾百列索引的所有列。
我需要的列總是不同的。例如,在早期的情況下,我需要Var1,Var2和Var3。在另一種情況下,我可能需要加載Var5,Var8和Var10。
謝謝您的建議 大號
這不是清楚你在做什麼。但是,增加更多/更大的索引可能不是問題的解決方案。索引應該適合內存。 –
你需要更具體一些。 –
我刪除了我的答案。您沒有提供有關您要優化的查詢或表結構的信息。我失去了幫助你解決這個問題的興趣。 –