MySQL,哪里不是很慢的查询?

MySQL,哪里不是很慢的查询?,mysql,Mysql,结果(=150件产品):产品于2007年在易趣商店和亚马逊商店进行验证 SELECT product_id FROM ebay_shop LEFT JOIN amazon_shop ON ebay_shop.product_id = amazon_shop.product_id WHERE ebay_shop.validated = 2007 AND amazon_shop.validated = 2007 结果(=4000件产品):产品于2010年在易趣商店进行验证 问题:我想找到2007年

结果(=150件产品):产品于2007年在易趣商店和亚马逊商店进行验证

SELECT product_id
FROM ebay_shop
LEFT JOIN amazon_shop ON ebay_shop.product_id = amazon_shop.product_id
WHERE ebay_shop.validated = 2007
AND amazon_shop.validated = 2007
结果(=4000件产品):产品于2010年在易趣商店进行验证

问题:我想找到2007年列表中未验证到2010年的产品,2007年有但2010年没有

我的问题是:


我的查询速度非常慢(~60秒),在4000条记录中找到150条。我需要帮助来改进此查询。

不在中对性能很糟糕。也许最好的方法是为你的2010做一个左连接,然后限定它为空。。。找到的任何记录都要扔掉,只保留通过连接限定符返回NULL的记录

此外,确保您的易趣店铺和亚马逊店铺上有一个基于年份和产品的索引,通过索引(已验证,产品id)。首先要有一年的理由,把所有的普通年份保持为一个小集合,然后在这个集合中循环所有的产品。然后,索引也将针对相应的连接进行优化

SELECT product_id
FROM ebay_shop
LEFT JOIN amazon_shop ON ebay_shop.product_id = amazon_shop.product_id
WHERE ebay_shop.validated = 2007
AND amazon_shop.validated = 2007
AND NOT IN (SELECT ebay_shop.product_id
            FROM ebay_shop
            WHERE ebay_shop.validated = 2010)

@DRapp写了一个很好的解决方法,我想补充一个想法

SELECT STRAIGHT_JOIN
      es.product_id
   FROM 
      ebay_shop eshop
         LEFT JOIN amazon_shop ashop
             ON eshop.validated = ashop.validated
            AND eshop.product_id = ashop.product_id

         LEFT JOIN ebay_shop ebay2
            on ebay2.validated = 2010
           and ebay2.product_id = eshop.product_id
   WHERE 
          eshop.validated = 2007
      and ebay2.validated is null
然后:

SELECT group_concat(product_id)
FROM ebay_shop 
LEFT JOIN amazon_shop ON ebay_shop.product_id = amazon_shop.product_id 
WHERE ebay_shop.validated = 2007 
AND amazon_shop.validated = 2007 

我意识到这不是一个真正的答案,而是一个不同的研究案例

我也使用“不在”但在不同的上下文中。我得到的结果是,对于一个大约有300条记录的表,查询需要10秒以上的时间

以下是查询:

SELECT product_id    
FROM ebay_shop    
LEFT JOIN amazon_shop ON ebay_shop.product_id = amazon_shop.product_id    
WHERE ebay_shop.validated = 2007    
AND amazon_shop.validated = 2007    
AND NOT IN (1,2,3,4)    /* results from first query */
“数字”字段是两个表中的常量。因此,我希望表中的所有记录都是membre\u mandataire的,并且在表mandataires\u actifs中找不到“numero\u mandataire”的地方合并或联接所有记录

我想我的解决办法是用“左加入”而不是“联合”,但我仍然坚持用“不加入”。我已经尝试了一段时间,但我无法让它工作

我正在学习MySQL,但看起来我还不太了解

谢谢你的帮助

  • 布莱斯

为什么你说它是“为每个记录进行子选择”?这不是一个相关的子查询。@ypercube,我的坏。。。昨晚11:30左右,没戴眼镜,读错了。解释输出是什么?表上有什么索引?联接和WHERE子句中使用的列的数据类型是什么?注意:您的
左联接
实际上是一个
内部联接
SELECT product_id    
FROM ebay_shop    
LEFT JOIN amazon_shop ON ebay_shop.product_id = amazon_shop.product_id    
WHERE ebay_shop.validated = 2007    
AND amazon_shop.validated = 2007    
AND NOT IN (1,2,3,4)    /* results from first query */
(
SELECT (
'inscrit'
) AS 
TYPE , membre_mandataire.id AS id, membres.prenom AS prenom, membres.nom_de_famille AS nom_de_famille, membre_mandataire.photo AS photo, membre_mandataire.niveau_qualification AS niveau_qualification, membre_mandataire.numero_mandataire AS numero_mandataire
FROM membres, membre_mandataire
WHERE membre_mandataire.id_membre = membres.id
AND membre_mandataire.confirme = 'Y'
AND membre_mandataire.visible_dans_liste = 'Y'
)
UNION (

SELECT (
'actif'
) AS 
TYPE , mandataires_actifs.id AS id, mandataires_actifs.prenom AS prenom, mandataires_actifs.nom_de_famille AS nom_de_famille, mandataires_actifs.photo AS photo, mandataires_actifs.niveau_qualification AS niveau_qualification, mandataires_actifs.numero_mandataire AS numero_mandataire
FROM mandataires_actifs, membre_mandataire
WHERE (
mandataires_actifs.numero_mandataire
) NOT 
IN (

SELECT membre_mandataire.numero_mandataire
FROM membre_mandataire
WHERE membre_mandataire.confirme = 'Y'
AND membre_mandataire.visible_dans_liste = 'Y'
)
)
ORDER BY nom_de_famille ASC