gpt4 book ai didi

MySQL,哪里不在非常慢的查询中?

转载 作者:行者123 更新时间:2023-11-29 01:32:20 24 4
gpt4 key购买 nike

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

结果(= 150 件产品):产品在 2007 年在 ebay_shop && amazon_shop 中得到验证

SELECT ebay_shop.product_id
FROM ebay_shop
WHERE ebay_shop.validated = 2010

结果(= 4000 件产品):产品在 2010 年在 ebay_shop 中得到验证

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

我的查询:

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)

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

最佳答案

NOT IN 在性能上很糟糕。最好的方法可能是为您的 2010 年执行 LEFT JOIN,然后将其限定为 NULL...找到的任何记录,将其丢弃,只保留通过连接限定符返回 NULL 的记录。

此外,通过索引 ( validated, product_id ) 确保你的 ebay 商店和亚马逊商店有一个基于 YEAR 和 PRODUCT 的索引。将年份放在首位的原因是,将所有普通年份保留为小集合,然后在其中循环所有产品。然后,索引也将针对相应的连接进行优化。

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

关于MySQL,哪里不在非常慢的查询中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8264450/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com