【发布时间】:2019-08-29 07:08:03
【问题描述】:
我有 products 和 categories 表,以及一个名为 product_catalog 的数据透视表,我需要更新 product_catalog 表,以便我可以删除少于五个产品的类别。这些冗余类别中的产品应移至其父类别。我为此编写了一个查询,但问题是这个 product_catalog 表中有 55213277 条记录,运行需要很长时间。 基本上它是一个嵌套查询,我们必须多次运行此查询,除非没有任何类别的产品少于五个。 这是我测试过的 sql 查询。
你能建议我一个优化的解决方案吗?
UPDATE product_catalogT AS C
INNER JOIN
(SELECT
COUNT(*) AS tp, catalog_id cid, g.parent_id pid
FROM
product_catalog AS p
LEFT JOIN catalog AS g ON p.catalog_id = g.id
Where g.parent_id <> 0
GROUP BY catalog_id
HAVING tp < 5)
AS A ON C.catalog_id = A.cid
SET
C.catalog_id = A.pid
【问题讨论】:
-
请注意
LEFT JOIN g... WHERE g = (or <>)与INNER JOIN g相同。除此之外,虽然有点冗长,但您的查询似乎基本上没问题。 SHOW CREATE TABLE 语句和内部 SELECT 的 EXPLAIN 会很有用。 -
子查询自行运行需要多长时间?
标签: mysql laravel query-optimization