【问题标题】:Optimizing a 1 Time SQL Update Statement In MariaDB在 MariaDB 中优化 1 次 SQL 更新语句
【发布时间】:2016-06-13 23:17:12
【问题描述】:

我正在尝试更新名为位置的表上的大约 4 万条记录,总共 6 列。 4 万条记录分为 6 个类别中的 1 个。类别包括:列“Bin”值以“a”、“b”、“c”、“d”、“e”结尾,或以上都不是。

我编写了以下更新语句,目的是直接在服务器上的表上运行。

UPDATE locations
SET Division=1, Bin=LEFT(Bin, LENGTH(Bin)-1)
WHERE RIGHT(Bin, 1)='a';

UPDATE locations
SET Division=2, Bin=LEFT(Bin, LENGTH(Bin)-1)
WHERE RIGHT(Bin, 1)='b';

UPDATE locations
SET Division=3, Bin=LEFT(Bin, LENGTH(Bin)-1)
WHERE RIGHT(Bin, 1)='c';

UPDATE locations
SET Division=4, Bin=LEFT(Bin, LENGTH(Bin)-1)
WHERE RIGHT(Bin, 1)='d';

UPDATE locations
SET Division=5, Bin=LEFT(Bin, LENGTH(Bin)-1)
WHERE RIGHT(Bin, 1)='e';

我从来没有一次更新超过 1-5 条记录,我不确定是否有更好的方法来做到这一点。

我可以使用 php 进行一些编码,所以如果需要将它纳入一个解决方案,我愿意接受这个想法。

如果我遗漏了任何相关或需要的信息,请告诉我。感谢您的所有帮助!

【问题讨论】:

    标签: mysql query-optimization mariadb


    【解决方案1】:

    只有 40k 条记录和 1 次更新,我不会太担心性能,但您可以尝试单个更新语句:-

    UPDATE locations
    SET Division =  CASE RIGHT(Bin, 1)
                        WHEN 'a'
                        THEN 1
                        WHEN 'b'
                        THEN 2
                        WHEN 'c'
                        THEN 3
                        WHEN 'd'
                        THEN 4
                        ELSE 5
                    END,
    Bin = LEFT(Bin, LENGTH(Bin)-1)
    WHERE RIGHT(Bin, 1) IN ('a', 'b', 'c', 'd', 'e');
    

    您当前解决方案的可能缺点是说记录的字段 bin 的值为“edcba”

    您的第一次更新将 Division 设置为 1 并将 bin 设置为“edcb”,但您的下一次更新会将同一行设置为 Division 2 和 bin 的“edc”等

    【讨论】:

    • 我什至没有意识到这个缺陷!非常感谢您指出并解决问题!
    【解决方案2】:

    (你说性能不是问题,但这个答案无论如何都解决了。)

    假设 bin 被索引,那么对于单个语句来说这会更快:

    UPDATE locations
            SET Division=2,
            Bin=LEFT(Bin, LENGTH(Bin)-1)
        WHERE bin LIKE 'b%';
    

    如果 a、b、c、d、e 真的是连续的,那么这将使 KickStart 的查询运行得更快 -- 将他的 WHERE 替换为:

    WHERE bin >= 'a'
      AND bin <  'f'
    

    【讨论】:

      猜你喜欢
      • 2012-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-31
      相关资源
      最近更新 更多