2016-11-08 52 views
-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 
  1. 我已經取代了 「內部連接」 與 「STRAIGHT_JOIN」。它更糟糕。 Mysql優化了查詢。
  2. 列中有空值。我無法給它一個價值,因爲空值意味着缺少價值,這意味着當時公司並沒有提供相應的價值。
  3. 我已經厭倦了爲tableB中的所有「選定變量」創建索引並運行查詢。它非常快。

在tableB上創建索引my_id1(fpeDate,fileDate,stockID,endDate,Var1,Var2,Var3);

如果我創建一個索引,如下所示,查詢時間變得很長。

create index my_id1 on tableB (fpeDate, fileDate, stockID); 

現在的問題:

  1. 我不能TableB中具有幾百列索引的所有列。

  2. 我需要的列總是不同的。例如,在早期的情況下,我需要Var1,Var2和Var3。在另一種情況下,我可能需要加載Var5,Var8和Var10。

謝謝您的建議 大號

+0

這不是清楚你在做什麼。但是,增加更多/更大的索引可能不是問題的解決方案。索引應該適合內存。 –

+0

你需要更具體一些。 –

+0

我刪除了我的答案。您沒有提供有關您要優化的查詢或表結構的信息。我失去了幫助你解決這個問題的興趣。 –

回答

0

這需要兩個方面 1)指數在查詢的順序

2)需要索引的所有選定變量