2012-07-11 96 views
1

我很糟糕,在做好MySQL查詢。我創建了這一個:MySQL - 如何優化我的查詢

SELECT SQL_CALC_FOUND_ROWS 
    `products_stock`.`products_id`, 
    `products_stock`.`products_stock_attributes`, 
    `products_stock`.`products_stock_quantity`, 
    `products`.`manufacturers_id`, 
    `products_description`.`products_name` 
FROM `products_stock` 
    LEFT JOIN `products` 
    ON `products_stock`.`products_id` = `products`.`products_id` 
    LEFT JOIN `products_description` 
    ON `products_stock`.`products_id` = `products_description`.`products_id` 
    LEFT JOIN `products_to_categories` 
    ON `products_stock`.`products_id` = `products_to_categories`.`products_id` 
WHERE `products_stock`.`products_stock_quantity` >=3 
    AND `products`.`products_status` = 1 
    AND ISNULL(`products`.`products_image`) = false 
    AND `products`.`products_image` != "" 
    AND EXISTS(
    select * from `allegro` 
    where `products_stock`.`products_id` = `allegro`.`product_id` 
    and `allegro`.`attributes` = `products_stock`.`products_stock_attributes` 
) = false 

products表有大約17K行, allegro表有行約3K。

查詢想法是選擇所有產品,其中stock_quanity> 3,其中是照片,並且allegro表中沒有產品ID。

現在查詢大約需要10秒。我不知道如何優化它。

@SOLVED

我已經添加索引allegro.product_id和allegro.attributes現在查詢tooks不到半秒。感謝所有的幫助

+0

你有沒有在數據庫中的任何索引? – Timst 2012-07-11 09:15:02

+3

請發佈EXPLAIN返回的內容以及所有表模式。 – Pentium10 2012-07-11 09:16:46

+0

您有解釋查詢結果:http://scr.hu/0an/q09nm – PiKey 2012-07-11 09:22:26

回答

2

擺脫EXISTS (SELECT …) = FALSE的東西。

把它轉換成沿着這些路線的東西:

LEFT JOIN allegro 
      ON products_stock.products_id = allegro.product_id 
     AND allegro.attributes = products_stock.products_stock_attributes 
… 
WHERE allegro.product_id IS NULL 

看到在MySQL的文檔的Rewriting Subqueries as Joins章。

進一步建議:

  • 不要用你不使用表連接,像products_to_categories
  • 而不是ISNULL(…) = FALSE… IS NOT NULL
+0

我已經將所有表格轉換爲InnoDB,我已經刪除了EXISTS()內容並添加了LEFT JOIN allegro,正如你所建議的那樣。我刪除了ISNULL(...)並使用IS NOT NULL。查詢速度與以前一樣緩慢,可能會加快1秒。 – PiKey 2012-07-11 09:55:06

+0

請發佈更新'EXPLAIN'輸出。查詢會產生多少結果行?如果這大大小於17k,那麼確定查詢中排除大多數省略產品的條件,並確保有一個快速提供該決定的索引。 – MvG 2012-07-11 10:04:47

+1

哇,我已經添加索引到'allegro'.'product_id'和'allegro'.attributes',現在查詢花了不到1秒!感謝所有的幫助。我不知道索引是如此重要。謝謝謝謝 – PiKey 2012-07-11 10:50:44

0

之前嘗試以下方法,檢查你的表引擎設置爲innoDB並正確索引,那麼你可以試試straight join。它會首先強制查看左邊的表格。

另一種方法是使用memcache進行緩慢查詢。您可以使用此方法將查詢結果緩存到數組中,避免頻繁查詢數據庫。緩存的結果可以在指定的時間段後更新。