【问题标题】:Update query optimization with large data使用大数据更新查询优化
【发布时间】: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 &lt;&gt;)INNER JOIN g 相同。除此之外,虽然有点冗长,但您的查询似乎基本上没问题。 SHOW CREATE TABLE 语句和内部 SELECT 的 EXPLAIN 会很有用。
  • 子查询自行运行需要多长时间?

标签: mysql laravel query-optimization


【解决方案1】:

这里写的有点少,但为了性能,我们需要查看您的表、索引和解释,如前所述。

 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

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

【讨论】:

  • 这里是查询的解释数据``` 1 UPDATE C NULL ALL product_catalog_catalog_id_foreign NULL NULL NULL 2219 100.00 NULL 1 PRIMARY NULL ref 8 bydepot_new.C.catalog_id 22393 100.00 NULL 2 DERIVED p NULL index product_catalog_catalog_id_foreign product_catalog_catalog_id_foreign 8 NULL 55213277 100.00 使用索引 2 DERIVED g NULL eq_ref PRIMARY,parant PRIMARY 4 bydepot_new.p.catalog_id 1 90.00 使用 where ```
  • 所以我需要如何快速完成并快速响应,谢谢,
  • 您能否编辑您的问题,以提供所需的额外信息 - EXPLAIN 所有相关表的 SHOW CREATE TABLE 语句
  • @Strawberry - 你不能从内部SELECT 中删除g.parent_id 吗?
  • @shairoo - 你多久运行一次?用户在等待结果吗?我正在考虑在后台和/或通过多表 UPDATE 以外的其他方式进行操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-31
  • 2017-08-27
  • 1970-01-01
  • 1970-01-01
  • 2021-07-10
  • 2015-11-08
相关资源
最近更新 更多