2017-09-28 212 views
1

我上表interim_19執行SQL請求以67.500排。表不被編入索引,且具有7列,非其中是唯一的/主鍵,因爲主數據AbonentidBase被重複,所有的數據中予有像7-8不同idBases和〜10.000不同Abonents,以及其他數據等date在唯一性方面不可靠。慢SQL INNER JOIN

的問題是在慢內部連接在這個表上。

如果我執行SELECT * FROM interim_19 WHERE idBase IN (1551 , 42286)它會採取1.33秒,並SELECT * FROM interim_19 WHERE idBase IN (1535 , 5406)將採取1.9秒,

SELECT * FROM (SELECT * FROM interim_19 WHERE idBase IN (1551 , 42286)) 
temp1 
inner join 
(SELECT * FROM interim_19 WHERE idBase IN (1535 , 5406)) temp2 
on temp1.Abonent = temp2.Abonent 

是否需要永遠 - 147-157秒。我知道內連接不會比較每一行到第二個表上的每一行,但是這不應該花這麼長時間。 OFC它讓重複的,但我需要的所有7個+ 7行,所以......

P.S我已經試圖建立索引,以便其他建議也歡迎。

+0

我沒有看到派生表的原因,並直接連接表。另外,只選擇您實際需要的列。 「SELECT *」對你沒有任何好處。 –

+0

它是mySql還是SQL Server?請編輯您的標籤 –

回答

2

添加的「複合」 INDEX(idBase, Abonent)

(而且,正如其他人指出,請使用JOIN,而不是子查詢。)

INDEX不需要是「唯一的」。

147秒是因爲子查詢執行了很多次,每次查看67K行。我認爲上面的索引將幫助到目前爲止提到的所有問題。

+0

謝謝你,兩項增加索引從147秒改善到0.8。 – upicik

2

嘗試消除這些不必要的子查詢:

SELECT * 
FROM interim_19 t1 
INNER JOIN interim_19 t2 
    ON t1.Abonent = t2.Abonent 
WHERE 
    t1.idBase IN (1551 , 4228) AND 
    t2.idBase IN (1535 , 5406) 

除此之外,你可以考慮在idBase列添加索引。正如評論中所建議的那樣,您也可以嘗試縮小您的選擇列表。

+0

如果我得到了另一個idBase來比較,我怎麼在這裏補充另一個內部聯接? – upicik

+0

如果您還有其他問題,那麼您可能需要提出一個新問題,而不是更改當前問題。 –

+0

不,我的意思是,我想在此查詢中添加另一個連接。應該是: 'SELECT * FROM interim_19 t1 INNER JOIN interim_19 t2 ON t1.Abonent = t2.Abonent INNER JOIN interim_19 t3 ON t3.Abonent = t2.Abonent WHERE t1.idBase IN(1551,4228)AND t2.idBase IN(1535,5406)AND t3.idBase IN(29551618)' – upicik

2

子查詢沒有索引。儘量避免他們,只要它是可能的:

SELECT * 
FROM interim_19 t1 
INNER JOIN interim_19 t2 
    ON (t1.Abonent = t2.Abonent AND t2.idBase IN (1535 , 5406)) 
WHERE 
    t1.idBase IN (1551 , 4228) 

會比添的回答快一點......

+0

如果我有另一個idBase進行比較,如何在此添加另一個內部連接? – upicik