MySQL执行时间黑魔法

MySQL执行时间黑魔法,mysql,select,join,where,Mysql,Select,Join,Where,所以我的mysql查询每次都加载了25秒。我拆分了查询,发现它在没有WHERE条件的情况下可以完美地工作。导致问题的条件是: eshop_products.id IN (SELECT product-id FROM eshop_productCombinations WHERE eshop_productCombinations.recomended = 1 GROUP BY product-id) 如果没有此条件,则加载查询需要0.019秒。但当我单独执行此选择时,

所以我的mysql查询每次都加载了25秒。我拆分了查询,发现它在没有WHERE条件的情况下可以完美地工作。导致问题的条件是:

eshop_products.id IN 
(SELECT product-id 
   FROM eshop_productCombinations 
   WHERE eshop_productCombinations.recomended = 1 
   GROUP BY product-id)
如果没有此条件,则加载查询需要0.019秒。但当我单独执行此选择时,加载只需0.026秒:

SELECT product-id 
FROM eshop_productCombinations 
WHERE eshop_productCombinations.recomended = 1 
GROUP BY product-id
有人知道我的主要问题出了什么问题吗?多谢各位

以下是完整的问题,尽管我认为它对任何人都没有用处:

SELECT
CAST(
  SUBSTRING_INDEX(
    GROUP_CONCAT(
      price_with_vat ORDER BY IF(eshop_products_cache.`stock` > 0, 1, 0) DESC,
      IF(
        eshop_products.`type_default_price`=2,eshop_products_cache.`price_with_vat`,
        if(
          eshop_products.`type_default_price`=0,eshop_products_cache.`default`,null
          )
      ) DESC,
      IF(eshop_products.`type_default_price`=1,eshop_products_cache.`price`, null) ASC
    ),
    ",
    ",
    1
  ) AS DECIMAL(10,2)
) AS `price_with_vat`,
SUBSTRING_INDEX(
  GROUP_CONCAT(
    eshop_products_cache.combination_id ORDER BY IF(eshop_products_cache.`stock` > 0, 1, 0) DESC,
    IF(
      eshop_products.`type_default_price`=2,
      eshop_products_cache.`price_with_vat`,
      if(
        eshop_products.`type_default_price`=0,
        eshop_products_cache.`default`,
        null
      )
    ) DESC,
    IF(eshop_products.`type_default_price`=1,eshop_products_cache.`price`, null)
    ASC
  ),
  ",
  ",
  1
) AS `combination_id`,
if( eshop_products.id in ('5993', '6144', '6663', '5120', '5376', '5632', '5888', '6400', '6656', '5121', '5377', '5633'), 1, 0) AS new
FROM `eshop_products` LEFT JOIN `eshop_products_cache` ON eshop_products_cache.product_id=eshop_products.`id` WHERE
(
  (
    (
      eshop_products.stockType = 2 AND eshop_products_cache.stock > 0
    )
    OR eshop_products.stockType <> 2
  )
)
AND
(
  price_with_vat > 0
)
AND
(
  eshop_products.recomended = 1
  OR
  eshop_products.id IN (
    SELECT `product-id` FROM eshop_productCombinations WHERE eshop_productCombinations.recomended = 1 GROUP BY `product-id`
  )
)
AND
(
  eshop_products.active = '1'
)
AND (dateStartPublish <= NOW() OR dateStartPublish IS NULL)
AND (dateStopPublish >= NOW() OR dateStopPublish IS NULL)
GROUP BY `eshop_products`.`id`, `eshop_products_cache`.`product_id` ORDER BY RAND() ASC LIMIT 5
根据建议,子查询必须替换为以下代码:

  EXISTS (
  SELECT 1 FROM eshop_productCombinations 
  WHERE eshop_productCombinations.recomended = 1
  AND product-id = eshop_products.id )
根据建议,子查询必须替换为以下代码:

  EXISTS (
  SELECT 1 FROM eshop_productCombinations 
  WHERE eshop_productCombinations.recomended = 1
  AND product-id = eshop_products.id )


不想听起来很讽刺,但这是eshop_products.id中的这一部分,在eshop_productCombinations中选择产品id,其中eshop_productCombinations.Recommend=1 GROUP BY product id您可能想问一下如何加快速度?然后发布你的解释输出,并提供一些关于你的表的信息,最好是show create table。我想我真的很笨,我不知道问题出在哪里,但你只是说它可以完美地解决它1是的,它通常在其他网站上在1-3秒内执行,但这一次,由于某些原因,它需要20秒以上的时间。我不想听起来很讽刺,但这是从eshop_productCombinations中选择产品id中的eshop_products.id部分,其中eshop_productCombinations.Recommend=1 GROUP BY product id您可能想问一下如何加快速度?然后发布你的解释输出,并提供一些关于你的表的信息,最好是show create table。我想我真的很笨,我不知道问题出在哪里,但你只是说它可以完美地解决它1好的,是的,它通常在其他站点上在1-3秒内执行,但由于某些原因,这一次需要20多秒,较新版本的MySQL将尽可能尝试自动将IN子句转换为EXISTS子句,但这并不总是一个简单的转换,服务器可以轻松、安全地应用,这就是为什么理解某些SQL查询设计为什么会更加繁重的原因,并在设计查询时牢记这一点,我不确定GROUPBY是否是您在该子查询中想要的。您没有任何需要它们的聚合函数,并且EXISTS函数可能没有您认为子查询结果是不同的那样有多大好处。明白了,这只是旧CMS的一部分,基于旧技术,迫切需要在不久的将来重建,所以这在不久的将来肯定会派上用场。谢谢你,但你说得对。很高兴我能为您指出正确的方向。仅供参考,MySQL的较新版本将尝试在可能的情况下自动将子句中的内容转换为EXISTS子句,但这并不总是一个简单的转换,服务器可以轻松安全地应用,这就是为什么要理解为什么某些SQL查询设计会更麻烦的原因,并且在设计查询时要记住这一点。而且,我不确定group by是否是您在该子查询中想要的。您没有任何需要它们的聚合函数,并且EXISTS函数可能没有您认为子查询结果是不同的那样有多大好处。明白了,这只是旧CMS的一部分,基于旧技术,迫切需要在不久的将来重建,所以这在不久的将来肯定会派上用场。谢谢你,但你说得对。很高兴我能为你指出正确的方向