簡體   English   中英

慢的SQL INNER JOIN

[英]Slow SQL INNER JOIN

我正在對67.500行的表interim_19執行sql請求。 表未建立索引,具有7列,其中沒有一個是唯一/主鍵,因為主數據AbonentidBase在重復,在所有數據中,我有7-8個不同的idBasesAbonents不同的Abonents ,其他數據如date的唯一性不可靠。

問題在於此表上的內部聯接緩慢。

如果我執行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行,所以...

PS:我已經在嘗試對其編制索引,因此也歡迎其他建議。

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

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列上添加索引。 並且如評論中所建議,您還可以嘗試縮小選擇列表的范圍。

子查詢沒有索引。 盡可能地避免它們:

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)

將比蒂姆的答案快一點...

添加'composite'INDEX INDEX(idBase, Abonent)

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

INDEX不必是“唯一的”。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM