SQL 多次更新与单次更新性能

Joh*_*Loo 8 sql sql-update

假设我有 10,000 行需要更新。什么会更快

UPDATE DB.Servers SET Live = 1 where name = 'server1';
UPDATE DB.Servers SET Live = 1 where name = 'server2';
...
UPDATE DB.Servers SET Live = 1 where name = 'server100000';

OR

UPDATE DB.Servers SET Live = 1 where name in ('server1', 'server2'...'server10000');
Run Code Online (Sandbox Code Playgroud)

我认为第二个选项更快,但我不确定。让我担心的是,我不知道 SQL stm 是否有长度限制。在这种情况下会推荐什么?

谢谢

小智 5

单曲UPDATE速度更快。

我已经用 MySQL 5.1.73 测试过

CREATE TABLE test_random (
  val char(40) NOT NULL default '',
  num int NOT NULL default '0',
  KEY val (val)
) TYPE=MyISAM;

INSERT INTO test_random (val, num) VALUES
('MXZJBXUGNFOZMMQMYZEMLKZZKTCIGEU',889),
('ZTEBMDHOJGYBYEOPZIIPPJQQOKXMTKU',351),
... [200K records total inserted] ...
('ADLDYZQHDEZMYBHORKGJYMIOVUETQCM',786);
Run Code Online (Sandbox Code Playgroud)

然后这里是random-update-single.sql

UPDATE test_random SET num=1 WHERE val IN (
'PXTUKCZMRFZDTWUPULAPENPNQCSPFQJ',
'GDIMLSCDRSNCMUNUZLQIDFZSEELNZLR',
... [100K records] ...
'ADLDYZQHDEZMYBHORKGJYMIOVUETQCM');
Run Code Online (Sandbox Code Playgroud)

这是random-update-multiple.sql

UPDATE test_random SET num=2 WHERE val='PXTUKCZMRFZDTWUPULAPENPNQCSPFQJ';
UPDATE test_random SET num=2 WHERE val='GDIMLSCDRSNCMUNUZLQIDFZSEELNZLR';
... [100K records] ...
UPDATE test_random SET num=2 WHERE val='ADLDYZQHDEZMYBHORKGJYMIOVUETQCM';
Run Code Online (Sandbox Code Playgroud)

结果如下:

> time mysql -uroot test < random-update-single.sql
0.075u 0.009s 0:01.78 3.9%      0+0k 0+0io 0pf+0w
> time mysql -uroot test < random-update-single.sql
0.074u 0.009s 0:01.76 3.9%      0+0k 0+0io 0pf+0w
> time mysql -uroot test < random-update-single.sql
0.069u 0.013s 0:01.57 4.4%      0+0k 0+0io 0pf+0w
Run Code Online (Sandbox Code Playgroud)
> time mysql -uroot test < random-update-multiple.sql
1.746u 1.515s 0:11.14 29.1%     0+0k 0+0io 0pf+0w
> time mysql -uroot test < random-update-multiple.sql
2.183u 2.150s 0:14.83 29.1%     0+0k 0+0io 0pf+0w
> time mysql -uroot test < random-update-multiple.sql
1.961u 1.949s 0:13.96 27.9%     0+0k 0+0io 0pf+0w
Run Code Online (Sandbox Code Playgroud)

也就是说, multipleUPDATE比 single 慢 5-6 倍UPDATE


Gio*_*nis 2

SQL 应该是一种声明性语言;它不期望用户说出“如何”获得结果,而只期望用户说出“什么”想要的结果。因此,原则上我会使用该in()构造,因为这是询问结果的最简洁(从逻辑角度来看)的方式,并让 DBMS(任何 DBMS!)决定什么是最好的。