簡體   English   中英

慢的MySQL查詢,還有3個左聯接

[英]Slow Mysql Query with 3 left join

我們有一個電子商店,在這個電子商店中,類別和產品之間存在許多復雜的鏈接。

我使用分類表來存儲產品-類別和產品-產品之間的關系作為子產品。

產品可能屬於多個類別。 產品可以是子產品,也可以是其他產品的子產品。 (可能不止一個)產品可能是另一個產品的模塊(可能不止一個)

查詢別名:pr-產品ct-類別sp-Sub產品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條記錄

我要說的是,MySQL每個查詢只能使用一個索引,但是現在看來情況已不再如此。 我也在另一個答案中遇到了這個問題: http : //dev.mysql.com/doc/mysql/en/index-merge-optimization.html

但是,這可能對您沒有幫助。

過去,當我遇到無法優化MySQL的查詢時,我就決定使用后台作業在另一個表中預先計算答案。

您正在嘗試做的事情看起來非常適合像neo4j這樣的圖形數據庫。

眾所周知,MySQL的優化器不利於自動將外部聯接更改為內部聯接,它先執行外部聯接,然后開始過濾數據。

在您的情況下,產品和分類法之間的聯接可以重寫為內部聯接(ct.destination_id = '47'上存在WHERE條件)。

請嘗試這是否會改變執行計划並提高性能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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