提高查询性能,只更新1列而不是3列

hivapdat  于 2021-06-21  发布在  Mysql
关注(0)|答案(3)|浏览(347)

从我下面的查询中可以看到,我正在更新 percenting_pages 以及 percentile_visits 公司1的列。

UPDATE mytable 
SET    percentile_pages = CASE 
                            WHEN pages >= 1 
                                 AND pages < 2 THEN 25 
                            WHEN pages >= 2 
                                 AND pages < 3 THEN 35 
                            WHEN pages >= 3 
                                 AND pages < 5 THEN 40 
                            WHEN pages >= 5 THEN 45 
                            ELSE percentile_pages 
                          END, 
       percentile_visits = CASE 
                             WHEN visits >= 2 
                                  AND visits < 3 THEN 25 
                             WHEN visits >= 3 
                                  AND visits < 4 THEN 35 
                             WHEN visits >= 4 
                                  AND visits < 6 THEN 40 
                             WHEN visits >= 6 THEN 45 
                             ELSE percentile_visits 
                           END
WHERE  company = 1

之后,在额外的这两列中( percentile_visits 以及 percentile_pages )为了更新 total_percentile 列。
我想做的是避免更新 percentile_visits 以及 percentile_pages 只更新一列 total_percentile .
这当然可以让我优化我的应用程序。有没有什么方法可以编辑查询,而不是更新列,对每个“值”求和?

uemypmqf

uemypmqf1#

可以这样添加值
如果您只需要总百分位数,并为此删除列 percentile_pages 以及 percentile_visits 然后你可以用 total_percentile 第二次设置为0

UPDATE mytable 
SET    
      total_percentile = (CASE 
                            WHEN pages >= 1 
                                 AND pages < 2 THEN 25 
                            WHEN pages >= 2 
                                 AND pages < 3 THEN 35 
                            WHEN pages >= 3 
                                 AND pages < 5 THEN 40 
                            WHEN pages >= 5 THEN 45 
                            ELSE total_percentile 
                          END) + 
                          ( CASE 
                             WHEN visits >= 2 
                                  AND visits < 3 THEN 25 
                             WHEN visits >= 3 
                                  AND visits < 4 THEN 35 
                             WHEN visits >= 4 
                                  AND visits < 6 THEN 40 
                             WHEN visits >= 6 THEN 45 
                             ELSE 0 
                           END) 
WHERE  company = 1

或者如果你需要更新所有的3列

UPDATE mytable 
SET    percentile_pages = CASE 
                            WHEN pages >= 1 
                                 AND pages < 2 THEN 25 
                            WHEN pages >= 2 
                                 AND pages < 3 THEN 35 
                            WHEN pages >= 3 
                                 AND pages < 5 THEN 40 
                            WHEN pages >= 5 THEN 45 
                            ELSE percentile_pages 
                          END, 
       percentile_visits = CASE 
                             WHEN visits >= 2 
                                  AND visits < 3 THEN 25 
                             WHEN visits >= 3 
                                  AND visits < 4 THEN 35 
                             WHEN visits >= 4 
                                  AND visits < 6 THEN 40 
                             WHEN visits >= 6 THEN 45 
                             ELSE percentile_visits 
                           END, 
      total_percentile = (CASE 
                            WHEN pages >= 1 
                                 AND pages < 2 THEN 25 
                            WHEN pages >= 2 
                                 AND pages < 3 THEN 35 
                            WHEN pages >= 3 
                                 AND pages < 5 THEN 40 
                            WHEN pages >= 5 THEN 45 
                            ELSE percentile_pages 
                          END) + 
                          ( CASE 
                             WHEN visits >= 2 
                                  AND visits < 3 THEN 25 
                             WHEN visits >= 3 
                                  AND visits < 4 THEN 35 
                             WHEN visits >= 4 
                                  AND visits < 6 THEN 40 
                             WHEN visits >= 6 THEN 45 
                             ELSE percentile_visits 
                           END) 
WHERE  company = 1
jtoj6r0c

jtoj6r0c2#

你的“优化”似乎毫无意义。在更新上花费的大部分时间涉及记录和修改数据,而不是设置单个列。更新一行中的三列与更新一列的开销完全相同,因为整行是一个单元。
我可以建议简化你的代码。这不是性能优化,只是一种简化:

UPDATE mytable 
    SET percentile_pages = (CASE WHEN pages >= 5 THEN 45
                                 WHEN pages >= 3 THEN 40
                                 WHEN pages >= 2 THEN 35
                                 WHEN pages >= 1 THEN 25
                                 ELSE percentile_pages
                            END),
       percentile_visits = (CASE WHEN visits >= 6 THEN 45
                                 WHEN visits >= 4 THEN 40
                                 WHEN visits >= 3 THEN 35
                                 WHEN visits >= 2 THEN 25
                                 ELSE percentile_visits
                            END),
       total_percentile =  (CASE WHEN pages >= 5 THEN 45
                                 WHEN pages >= 3 THEN 40
                                 WHEN pages >= 2 THEN 35
                                 WHEN pages >= 1 THEN 25
                                 ELSE percentile_pages
                            END) +
                           (CASE WHEN visits >= 6 THEN 45
                                 WHEN visits >= 4 THEN 40
                                 WHEN visits >= 3 THEN 35
                                 WHEN visits >= 2 THEN 25
                                 ELSE percentile_visits
                            END)
    WHERE company = 1 AND (visits >= 2 OR pages >= 1);

为什么要更新 total_percentile 不会做你想做的是下一次更新。在这种情况下 visits 或者 pages 如果不更改,则需要 percentile_pages 以及 percentile_visits .
在任何情况下,不更新单个值都不会带来真正的性能提升。

lx0bsm1f

lx0bsm1f3#

您说要更新列。所以我假设“总和”并不是指总和 SUM() 函数,否则将更新行值(可能是company=id\u all?)的值。
如果我的假设是正确的,你可以说

UPDATE mytable 
SET    total_percentile = CASE ... ELSE 0 END + CASE ... ELSE 1 END
       WHERE (visits > 1 OR pages > 0) [ AND company = 1 ]

这两个案例是您已经使用的案例,但else已被0替换。这会在pages=1和visits=0时创建一个边框,但我认为这不太可能。
该查询将适用于单个公司,或任何选定的公司。

相关问题