MySQL,哪里不是很慢的查询?
结果(=150件产品):产品于2007年在易趣商店和亚马逊商店进行验证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年
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,但看起来我还不太了解
谢谢你的帮助
- 布莱斯
左联接
实际上是一个内部联接
。
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