mysql - 利用大数据更新查询优化

标签 mysql laravel query-optimization

我有 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

最佳答案

这里的内容要少一些,但为了提高性能,我们需要查看您的表、索引和 EXPLAIN,如上所述。

 UPDATE product_catalogT C
  JOIN
     ( SELECT p.catalog_id
         FROM product_catalog p
        JOIN catalog g 
          ON p.catalog_id = g.id
        Where g.parent_id <> 0
       GROUP 
            BY catalog_id
       HAVING COUNT(*) < 5
     ) A 
    ON C.catalog_id = A.cid
   SET C.catalog_id = A.pid

另外,我可能会提到这似乎是一个相当奇怪的请求

关于mysql - 利用大数据更新查询优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57704813/

相关文章:

mysql - 如何在mysql中添加或显示来自其他表计算的列值

android - 我可以使用 Firebase Auth 或 FaceBook 帐户套件代替 SMSprovider 吗?

mysql - 在 Laravel 中使用谷歌地图和 mysql 进行半径搜索

php - Laravel:与数组的额外字段同步

mysql - 优化 5 表 SQL 查询(stores => items => words)

mysql - 在 SELECT WHERE 之前添加表索引并在 INSERT 之前删除它们

mysql - 显示列的两种字符编码的信息模式

php - 目标类 [Api\UserController] 不存在

mysql - SQL语句优化: Why the command runs slow?

sql - 优化大型 SQL 迁移