2012-01-28 80 views
2

我的問題是這樣的:MySQL的子查詢與JOIN性能差

select * from 
    (
    select * from barcodesA 
    UNION ALL 
    select * from barcodesB 
    ) 
    as barcodesTOTAL, boxes 
where barcodesTotal.code=boxes.code; 

表barcodesA有4000項 表barcodesB有4000項 表盒有一個像180.000項

它需要30秒proccess的查詢。

另一個有問題的查詢:

select * from 
    viewBarcodesTotal, boxes 
where barcodesTotal.code=boxes.code; 

viewBarcodesTotal包含UNION ALL從兩個條形碼錶。它也需要永遠。

同時,

 select * from barcodesA , boxes where barcodesA.code=boxes.code 
     UNION ALL 
     select * from barcodesB , boxes where barcodesB.code=boxes.code 

這其中需要<1秒。

問題顯然是爲什麼?是我的代碼被竊聽?是mysql竊聽?

我必須從訪問遷移到MySQL,我將不得不重寫所有我的代碼,如果第一個選項在竊聽。

+0

簡而言之:子查詢很慢,儘可能避免它們。 – Polynomial 2012-01-28 22:22:40

+1

您可能需要在查詢上運行EXPLAIN並在您的問題中包含該輸出。否則,你有代碼字段上的索引嗎?你真的需要獲得所有的數據或一個子集(基於條件)就足夠了嗎? – 2012-01-28 22:33:56

回答

0

如果您還沒有,請在boxes.code上添加索引。將180條記錄(4K + 4K)加入180,000將受益於180K方程的索引。

另外,請明確指出您在SELECT語句中需要的字段。在生產用途查詢中使用*是不好的形式,因爲它鼓勵您不必考慮哪些字段(以及它們可能有多大),更不用說在示例中有兩個不同的表格,barcodesabarcodesb可能有潛在的不同的數據類型和你UNIONing列訂單....

+0

條碼A,條碼A包含與衣服相關的條碼。盒子包含與盒​​子相關的20個條形碼。我應該把索引放在哪裏?此外,我不使用選擇*,我只是想簡化它可以更輕鬆地閱讀。 – Fran 2012-01-28 23:21:17

0

的性能差異的原因...

第一個查詢說...首先,做好每一個記錄的完整的工會進行了將B中的每條記錄聯合起來,然後將其加入代碼框中。工會沒有索引要優化。通過明確地應用你的SECOND查詢實例,每個表在連接上單獨進行了優化(顯然每個表現都有一個索引,但是我會確保這兩個表都有「代碼」列上的索引)。

+0

我該如何檢查索引? 它應該是什麼列? 記住這個表格: 條形碼> barcode,seasson,型號,顏色 barcodesB> barcde,seasson,model,color .------。 :::::例如::::: 84232323232,1,100,225 盒> boxNumber,條碼,細節 :::::例如::::: 000000000001,84232323232,無論 – Fran 2012-01-28 23:43:41

+0

@Fran ,http://dev.mysql.com/doc/refman/5.0/en/getting-information.html顯示「Describe Table {yourTable}」命令(其中包括) – DRapp 2012-01-28 23:48:57

+0

您需要屏幕截圖嗎? – Fran 2012-01-29 09:41:22