我在带有InnoDB引擎的MySQL中有一个表v_ext:
- id:主键
- 代码:预生成的代码列表(比如1000个代码随机生成)
- user_id:initial NULL
当用户购买商品时,他们会收到代码.我需要更新表以填充user_id列.我有两个选择:
START TRANSACTION;
SELECT id FROM v_ext WHERE user_id IS NULL LIMIT 1 FOR UPDATE; -- return id 54 for ex.
UPDATE v_ext SET user_id=xxx WHERE id=54;
COMMIT;
Run Code Online (Sandbox Code Playgroud)
要么
UPDATE v_ext SET user_id=xxx WHERE user_id IS NULL LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
如果我有数千名用户同时购买,第二种选择是否安全?如果是这样,假设第二个选项对性能更好是否正确,因为它只需要一个查询?
JSc*_*Ced 14
由于我没有得到答案,我开始做基准测试.我的标准如下:
ab带有20,000个请求的Apache 命令,100个并发:ab -n 20000 -c 100结果:
SELECT ... FOR UPDATE; 更新......:
Concurrency Level: 100
Time taken for tests: 758.116 seconds
Complete requests: 20000
Failed requests: 0
Write errors: 0
Row updated: 20000
Run Code Online (Sandbox Code Playgroud)
更新....限制1:
Concurrency Level: 100
Time taken for tests: 773.659 seconds
Complete requests: 20000
Failed requests: 0
Write errors: 0
Row updated: 20000
Run Code Online (Sandbox Code Playgroud)
所以至少在我的系统上,带有2个查询的选项似乎比一个查询更有效.我没想到:)