在MariaDB中优化1次SQL更新语句

时间:2016-03-01 13:45:31

标签: mysql query-optimization mariadb

我正在尝试在名为locations的表上更新大约4万条记录,共有6列。 4万条记录属于6类中的1类。类别是:Column" Bin"价值结束于''''' c'' d',' e'或者没有上述的。

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

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做一些编码,所以如果一个解决方案需要合并它,我就可以接受这个想法了。

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

2 个答案:

答案 0 :(得分:0)

只有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');

当前解决方案的可能缺点是说记录的字段为'edcba'

你的第一次更新你将Division设置为1并将bin设置为'edcb',但是你的下一个UPDATE会将同一行设置为2的分区和'edc'等的bin

答案 1 :(得分:0)

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

假设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'