2012-02-22 65 views
4

我有如下表:多個左連接和性能

產品 - 4500個記錄

字段:ID,SKU,姓名,別名,價格,special_price,數量,說明,照片,MANUFACTURER_ID,MODEL_ID ,命中,出版

products_attribute_rel - 35000個記錄

字段:ID,PRODUCT_ID,attribute_id,attribute_val_id

ATTRIBUTE_VALUES - 243個記錄

字段:ID,attr_id,價值,訂貨

廠商 - 共有29個記錄

字段:ID,標題,出版

模型 - 946條記錄

字段:ID,MANUFACTURER_ID,標題,發佈

所以我通過一個查詢得到這些表格數據:

SELECT jp.*, 
     jm.id AS jm_id, 
     jm.title AS jm_title, 
     jmo.id AS jmo_id, 
     jmo.title AS jmo_title 
FROM `products` AS jp 
LEFT JOIN `products_attribute_rel` AS jpar ON jpar.product_id = jp.id 
LEFT JOIN `attribute_values` AS jav ON jav.attr_id = jpar.attribute_val_id 
LEFT JOIN `manufacturers` AS jm ON jm.id = jp.manufacturer_id 
LEFT JOIN `models` AS jmo ON jmo.id = jp.model_id 
GROUP BY jp.id HAVING COUNT(DISTINCT jpar.attribute_val_id) >= 0 

該查詢是緩慢的地獄。它需要數百秒的時間來處理它。 那麼如何改進這個查詢呢?有了小數據塊,它可以很好地工作於 。但我猜一切都毀了products_attribute_rel表,其中 有35000條記錄。

您的幫助,將不勝感激。

編輯SELECT查詢

EXPLAIN結果:

EXPLAIN results of the SELECT query

+1

您可能需要創建非羣集覆蓋索引。 – 2012-02-22 07:33:13

+0

你使用任何索引方法,如B樹等? – DonCallisto 2012-02-22 07:33:40

+2

在'SELECT'前面放置'EXPLAIN'並顯示結果。這可以幫助我們找出瓶頸是什麼。 – Mike 2012-02-22 07:38:32

回答

8

問題是MySQL對3個表使用連接類型ALL。這意味着MySQL執行3次全表掃描,將所有可能性放在一起,然後對那些不符合ON聲明的聲明進行排序。爲了獲得更快的聯接類型(例如eq_ref),您必須在ON語句中使用的coloumns上放置索引。

請注意,不建議將索引放在每個可能的色彩上。很多索引都會加快SELECT語句的速度,但由於索引必須存儲和管理,因此也會產生開銷。這意味着操縱查詢如UPDATEDELETE要慢得多。我看到查詢在半個小時內只刪除了1000條記錄。這是一個折衷,你必須決定更經常發生的事情,更重要的是什麼。

要獲得有關MySQL連接類型的更多信息,請查看this
更多關於指標here

+0

謝謝邁克。我把索引,現在一切正常完美。 – Bounce 2012-02-22 08:21:26

1

表數據與其說是巨大的,它的服用幾百秒。表模式有些問題。請做適當的索引。那將會加速。

0
select distinct 
jm.id AS jm_id, 
jm.title AS jm_title, 
jmo.id AS jmo_id, 
jmo.title AS jmo_title 
from products jp, 
products_attribute_rel jpar, 
attribute_values jav, 
manufacturers jm 
models jmo 
where jpar.product_id = jp.id 
and jav.attr_id = jpar.attribute_val_id 
and jm.id = jp.manufacturer_id 
and jmo.id = jp.model_id 

你可以做,如果你想選擇所有的數據。希望它有效。