[英]MySQL super slow inner join with group by
我在加入下面的2個表時遇到問題。 我需要的是第一個表中的所有零件,在第二個表中找到了clei OR零件號,並計算了表1中有多少個匹配項。
=================== ===================
table: svi table: svp
=================== ===================
id id
po price
customer clei
clei partNumber
partNumber description
==================== ===================
svi有大約一百萬行。 svp大約有2000。這是我正在使用的聯接...
SELECT svi.clei,
svi.partNumber,
count(*)
FROM svp svp
INNER JOIN
svi svi
ON (svp.clei = svi.clei)
OR (svp.partNumber = svi.partNumber)
GROUP BY svi.partNumber
該查詢要花2分多一點的時間才能運行,這似乎很慢。 clei和partNumber在兩個表中都被索引。 我還能做些什么來加快加入速度?
索引在這里沒有太大幫助,因為沒有針對常量的WHERE
條件,也沒有OR
運算符。
讀取svp
表的所有2000行; 常量的條件減少了從表中讀取的行數,但是這里沒有這樣的條件。
然后,對於這2000行中的每一行,在svi
表的索引中執行一次或兩次查找以標識匹配的行。 一個用於clei
,如果不成功,則另一個用於partNumber
。 或相反亦然。
在列上一個復合索引clei
和partNumber
表svi
這里沒有幫助; 當使用OR
組合條件時,它會有所幫助。
不使用表svp
上的索引。 如果在索引svp
同時包含clei
和partNumber
列那么MySQL可以決定在這里讀到它只是因為它含有小於整個表的數據量。 但是它仍然讀取整個索引並處理所有行。 它不能使用索引來過濾行,因為svp
上沒有過濾。
比這更糟糕(讀取整個svi
表和使用索引的svp
進行查找),但MySQL是足夠聰明,先處理較小的表。
將EXPLAIN
放在查詢的前面,MySQL 會用更少的言語告訴您我上面試圖解釋的內容。
就像我在評論中所說的那樣,查詢是無效的SQL。 對於一個價值svi.partNumber
你可能有一個以上的值svi.clei
。 GROUP BY svi.partNumber
子句從表svi
所獲得的所有具有partNumber
值相同的行中生成一個輸出行。
但是,由於同一partNumber
有兩個或多個不同的值, clei
它對於SELECT
子句中的svi.clei
表達式所svi.clei
的最終值是不確定的。 這意味着,如果稍后再次運行同一查詢,或者在鏡像數據庫的其他服務器上運行該查詢(或在備份數據庫然后從備份還原數據庫之后),則可以更改它。
如果您只是忘記在GROUP BY
子句中添加svi.clei
,那么這是一個簡單的解決方法,但是否則您必須重新考慮您的查詢,因為到目前為止,它不會產生您期望的結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.