mysql查询在数据库上消耗很长时间,在其他方面工作正常

时间:2017-05-19 12:21:10

标签: mysql database optimization indexing

我正在执行此查询以获取我网站上每个类别的产品数量

SELECT  COUNT(DISTINCT p.product_id) AS total
    FROM  category_path cp
    LEFT JOIN  product_to_category p2c  ON (cp.category_id = p2c.category_id)
    LEFT JOIN  product p  ON (p2c.product_id = p.product_id)
    LEFT JOIN  product_description pd  ON (p.product_id = pd.product_id)
    LEFT JOIN  product_to_store p2s  ON (p.product_id = p2s.product_id)
    WHERE  pd.language_id = '1'
      AND  p.status = '1'
      AND  p.date_available <= NOW()
      AND  p2s.store_id = '0'
      AND  cp.path_id = '20'
      AND  p.is_family ='1';

在我的本地计算机上,它可以正常工作并在.02

内返回结果
+-------+
| total |
+-------+
|   392 |
+-------+
1 row in set (0.02 sec)`

但是当我在我的服务器上执行相同的查询时,需要很多次

+-------+
| total |
+-------+
|   412 |
+-------+
1 row in set (0.78 sec)

我搜索了任何可能的解决方案,但我没有找到,如果有人可以帮我找到我会欣赏的原因。

2 个答案:

答案 0 :(得分:1)

您可以尝试建立索引

示例 - :

ALTER TABLE `table` ADD INDEX `product_id` (`product_id`);
ALTER TABLE `table` ADD INDEX `language_id` (`language_id`);
ALTER TABLE `table` ADD INDEX `status` (`status`);
ALTER TABLE `table` ADD INDEX `date_available` (`date_available`);
ALTER TABLE `table` ADD INDEX `store_id` (`store_id`);
ALTER TABLE `table` ADD INDEX `path_id` (`path_id`);
ALTER TABLE `table` ADD INDEX `is_family` (`is_family`);

答案 1 :(得分:1)

  • 除非您需要,否则不要使用LEFT。它可能会抑制优化。
  • 您是否在两台机器上使用相同的版本?
  • p2c和p2s闻起来像很多:很多映射表。如果是,请参阅this以获取有关优化的提示。
  • p需要复合INDEX(is_family, status, date_available)