2014-02-15 81 views
0

我們有一家電子商店,在這個電子商店中,類別和產品之間有許多複雜的聯繫。緩慢的Mysql查詢,3個左連接

我正在使用分類標準表來存儲產品 - 類別和產品 - 產品之間的關係作爲子產品。

產品可能是多個類別的成員。 產品可能是其他產品的子產品。 (可能多於一個) 產品可以是其它產品的模塊(可能多於一個)的查詢的

別名: PR-產品 CT-類別 SP-子產品 MD-模塊

Select pr.*,ifnull(sp.destination_id,0) as `top_id`, 
    ifnull(ct.destination_id,0) as `category_id` 
from Products as pr 
Left join Taxonomy as ct 
    on (ct.source_id=pr.id and ct.source='Products' and ct.destination='Categories') 
Left join Taxonomy as sp 
    on (sp.source_id=pr.id and sp.source='Products' and sp.destination='Products' and sp.type='TOPID') 
Left join Modules as md 
    on(pr.id = md.product_id) 
where pr.deleted=false 
    and ct.destination_id='47' 
    and sp.destination_id is null 
    and md.product_id is null 
order by pr.order,pr.sub_order 

使用此查詢;我試圖讓所有產品在Category_id = 47下,而不是任何產品的模塊,也不是任何產品的子產品。

此查詢需要23秒。 產品中有7.820條記錄,模塊中有3.200條記錄,分類標準有19.000條記錄

回答

0

我想說的是,MySQL只能對每個查詢使用一個索引,但看起來不再是這種情況。我也遇到了另一個答案: http://dev.mysql.com/doc/mysql/en/index-merge-optimization.html

但是,這可能不會幫助你。

過去,當我遇到查詢時MySQL無法優化我已經解決了使用後臺作業在另一個表中預計算答案的問題。

你想要做的事看起來很適合像neo4j這樣的圖形數據庫。

0

MySQL的優化器自動更改外部到內部聯接是不好的,它首先執行外部聯接,然後開始過濾數據。

在你的情況下,Products和Taxonomy之間的連接可以被重寫爲一個Inner Join(在ct.destination_id = '47'處有一個WHERE條件)。

如果這改變了執行計劃並提高了性能,請嘗試。