簡體   English   中英

MySQL超慢內部連接與分組依據

[英]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 或相反亦然。

在列上一個復合索引cleipartNumbersvi這里沒有幫助; 當使用OR組合條件時,它會有所幫助。

不使用表svp上的索引。 如果在索引svp同時包含cleipartNumber列那么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.

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