2012-06-04 97 views
0
SELECT products.* 
FROM products 
LEFT JOIN product_category 
    ON products.id_product = product_category.id_produs 
LEFT JOIN categories 
    ON product_category.id_category = categories.id_category 
INNER JOIN options 
    ON products.id_product = options.id_product 
WHERE categories.id_category = '472' 
AND product_category.id_category = categories.id_category 
LIMIT 0, 20 

您好,我正在編程競賽的電子商務網站上工作,我在類別頁面上出現了一些問題,其中列出了產品。在電子商務網站上緩慢查詢(選擇產品)

在MySQL中有4個表:產品,類別,product_category(包含類別和產品的關係)和選項。選項表包含您可以選擇購買的產品的各種屬性(如重量,高度,顏色)。我需要在類別頁面上調用它們,因爲有產品過濾器,當我選擇顏色:紅色時,它將顯示具有屬性顏色:紅色的所有產品。

如果我在產品表中有10 000行,並且每個產品有5個選項,那麼選項表將會有50 000行,問題是查詢速度會很慢,並且會花費30秒以上顯示產品。 我確定問題出在查詢上,但我不知道該怎麼做。我應該在查詢中編寫什麼內容才能在5秒內獲得頁面上的產品?

+1

您能否包含此查詢的執行計劃? – ajreal

+0

您的id_category/id_product列上是否有指紋? – Oliver

+0

發佈查詢的['EXPLAIN'](http://dev.mysql.com/doc/refman/5.0/en/using-explain.html) –

回答

0

請確保您在這些表的id_category和id_product上有索引,然後在其前面粘貼EXPLAIN,併發布輸出,說實話,如果您沒有索引,那麼無論如何都可以完成這項工作。

+1

謝謝。索引是問題,因爲它們沒有定義。 – Cosmi

+0

很高興幫助。確保你接受本網站的答案 - 否則人們不會回答你的更多問題! :) –

0

有幾件事情:你指定兩次這種關係:

AND product_category.id_category = categories.id_category 

ON product_category.id_category = categories.id_category 

這可能會混淆你的數據庫的優化。

另一個潛在的優化是將你正在做WHERE子句的列移動到一個表上。打開WHERE categories.id_category = '472'product_category.id_category = '472' `,它會減少共同參加的記錄數。

由於在一些問題提到的,EXPLAIN計劃將告訴你什麼你查詢的一部分是緩慢的,並給你,如果指示有索引缺失。

相關問題