优化 MariaDB 中的 1 次 SQL 更新语句
Optimizing a 1 Time SQL Update Statement In MariaDB
我正在尝试更新 table 命名位置上的大约 4 万条记录,总共有 6 列。 40,000 条记录属于 6 个类别中的 1 个。类别是:列 "Bin" 值以 'a'、'b'、'c'、'd'、'e' 或 none 结尾前面提到的
我写了下面的 Update 语句,目的是 运行 直接在服务器上的 table 上。
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 进行一些编码,因此如果解决方案需要合并它,我愿意接受这个想法。
如果我遗漏了任何相关或需要的信息,请告诉我。感谢您提供的所有帮助!
只有 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',但是您的下一个更新会将同一行设置为 2 Division 和 bin 'edc',等等
(您说性能不是问题,但这个答案无论如何都解决了这个问题。)
假设 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'
我正在尝试更新 table 命名位置上的大约 4 万条记录,总共有 6 列。 40,000 条记录属于 6 个类别中的 1 个。类别是:列 "Bin" 值以 'a'、'b'、'c'、'd'、'e' 或 none 结尾前面提到的
我写了下面的 Update 语句,目的是 运行 直接在服务器上的 table 上。
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 进行一些编码,因此如果解决方案需要合并它,我愿意接受这个想法。
如果我遗漏了任何相关或需要的信息,请告诉我。感谢您提供的所有帮助!
只有 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',但是您的下一个更新会将同一行设置为 2 Division 和 bin 'edc',等等
(您说性能不是问题,但这个答案无论如何都解决了这个问题。)
假设 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'