插入到具有多个if表达式的重复密钥更新的效率



我正在努力优化一个sql的效率它看起来像:

Insert into order_table ( id, business_line, order_type,...)
values(1123123,4,5,·····)
ON DUPLICATE KEY UPDATE
business_line = IF( _version <= 6 ,10,business_line),
order_type = IF( _version <= 6 ,2,order_type)
..........

有许多if条件

而且它运行得很慢。(约250ms(

有什么办法把这么多"如果"联系在一起吗?例如:

Insert into order_table ( id, business_line, order_type,...)
values(1123123,4,5,·····)
ON DUPLICATE KEY UPDATE
SET (business_line,order_type,...) = 
IF( _version <= 6 ,(10,2),(business_line,order_type)),
..........

任何建议都将受到的赞赏

当目标是"更新";几个特定的行。使用唯一密钥(如id(:

INSERT INTO t
(id, a,b,c)
VALUES
(654, 1,2,3),
(666, 11,22,33),
...
ON DUPLICATE KEY UPDATE
b = VALUES(b),
c = VALUES(c);

当目标是";插入";几个新行。不提供任何唯一值(例如AUTO_INCREMENTid(:

INSERT INTO t
(id, a,b,c)
VALUES
(NULL, 1,2,3),
(NULL, 11,22,33),
...
ON DUPLICATE KEY UPDATE
b = VALUES(b);

等效地,省略AUTO_INCREMENT列和NULLs列。

注意:8.0版本希望使用以下语法:

b = NEW.b

(注意:在你的环境中测试这个;我还没有对所有的变体进行实验。(

这种技术应该更快,因为:

  • 只有一次往返服务器
  • 如果是autocommit=ON,则该批次只有一个事务

最新更新