[英]Slow SQL INNER JOIN
我正在對67.500行的表interim_19
執行sql請求。 表未建立索引,具有7列,其中沒有一個是唯一/主鍵,因為主數據Abonent
和idBase
在重復,在所有數據中,我有7-8個不同的idBases
和Abonents
不同的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.