MySQL - 如何优化我的查询

时间:2012-07-11 09:11:45

标签: mysql optimization

我在制作好的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行。

查询Idea是选择所有产品,其中stock_quanity> 3,照片在哪里,allegro表中没有产品ID。

现在查询大约需要10秒钟。我不知道如何优化它。

@SOLVED

我已经为allegro.product_id和allegro.attributes添加了索引,现在查询的时间不到一半。谢谢大家的帮助

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

在尝试以下方法之前,检查您的表引擎设置为innoDB并将其正确编入索引,然后您可以尝试straight join。它将首先强制查看左表。

另一种方法是使用memcache进行慢速查询。您可以使用此方法将查询结果缓存到数组中,从而避免频繁查询数据库。缓存的结果可以在指定的时间段后更新。