2012-07-11 54 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进行缓慢查询。您可以使用此方法将查询结果缓存到数组中,避免频繁查询数据库。缓存的结果可以在指定的时间段后更新。