假设我有 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。
SQL 应该是一种声明性语言;它不期望用户说出“如何”获得结果,而只期望用户说出“什么”想要的结果。因此,原则上我会使用该in()构造,因为这是询问结果的最简洁(从逻辑角度来看)的方式,并让 DBMS(任何 DBMS!)决定什么是最好的。
| 归档时间: |
|
| 查看次数: |
4712 次 |
| 最近记录: |