这看起来在概念上很简单,但是一旦我把它放在SQL术语中,就很难了。
假设一个表中有3行称为“stuff”。
col1 col2 col3
------ ------ ------
aaaa bbbb cccc
xxxx yyyy zzzz
aaaa bbbb cccc
假设我想添加一个pk列并为其赋予唯一值。在更新中没有SQL可以提供更新第1行而不是第3行。但事实证明,MySQL允许的SQL扩展可以给出答案。
alter table stuff add column pk int;
update table set pk = 1 where pk is NULL limit 1;
update table set pk = 2 where pk is NULL limit 1;
update table set pk = 3 where pk is NULL limit 1;
这给了我:
pk col1 col2 col3
------ ------ ------ ------
1 aaaa bbbb cccc
2 xxxx yyyy zzzz
3 aaaa bbbb cccc
但事实证明,如果你使用超过500万行的表来执行此操作,则需要很长时间。我猜想它正在做一大堆工作来找到所有行的pk = NULL,而我真正想要的只是一个。
有谁知道为什么这会慢慢运行?是否有更快或更多SQL兼容的方法来做到这一点?我想不出它会是什么。
答案 0 :(得分:3)
您的查询速度很慢,因为您的IS NULL
条件每次都会生成FULL SCAN
- 这是因为,显然,您仍然无法使用列上的索引(您还没有)
您可以使用MySQL variables生成唯一值。那将是:
UPDATE stuff CROSS JOIN (SELECT @pk:=0) AS init SET stuff.pk=@pk:=@pk+1