【发布时间】:2012-01-26 10:32:04
【问题描述】:
我现在有一个有 604 000 行的表。我想删除 4000 个随机行,所以我的表将只包含 600 000 个条目。
有没有快速的方法?
非常感谢。
【问题讨论】:
-
DELETE FROM table WHERE id = RAND() LIMIT 4000? :) 或RANDOM()?也不确定;)
我现在有一个有 604 000 行的表。我想删除 4000 个随机行,所以我的表将只包含 600 000 个条目。
有没有快速的方法?
非常感谢。
【问题讨论】:
DELETE FROM table WHERE id = RAND() LIMIT 4000? :) 或RANDOM()?也不确定;)
理论上,这将是随机且快速的。实际上,它只会很快:
DELETE FROM tableX
LIMIT 4000
这将是随机的,但非常慢,有 600K 行:
DELETE FROM tableX
ORDER BY RAND()
LIMIT 4000
这不会是真正随机的(因为 id 中通常存在间隙),它甚至可能不会完全删除 4000 行(但当有很多间隙时会减少一些),但它可能比以前更快。
需要在子查询中进行额外的包装,因为从多个表中删除的语法不允许LIMIT:
DELETE td
FROM
tableX AS td
JOIN
( SELECT t.id
FROM
tableX AS t
CROSS JOIN
( SELECT MAX(id) AS maxid
FROM tableX
) AS m
JOIN
( SELECT RAND() AS rndm
FROM tableX AS tr
LIMIT 5000
) AS r
ON
t.id = CEIL( rndm * maxid )
LIMIT 4000
) AS x
ON
x.id = td.id
解释输出(来自 400K 行表的子查询):
id table possible_keys key_len rows
select_type type key ref Extra
1 PRIMARY <derived2> system 1
1 PRIMARY <derived3> ALL 5000
1 PRIMARY t eq_ref PRIMARY PRIMARY 4 func 1 Using where;Using index
3 DERIVED tr index PRIMARY 4 398681 Using index
2 DERIVED Select tables optimized away
【讨论】:
ORDER BY ROUND(RAND(), <n>) 会更快,n 越少越快。例如,n=2,n=3。显然它不会被打乱,但是当速度是一个问题时,这仍然有很大的帮助。
delete from yourTable limit 4000
【讨论】:
如果我不得不冒险猜测:
DELETE FROM table where id = (SELECT id FROM table ORDER BY rand() LIMIT 1) LIMIT 10
【讨论】:
DELETE FROM TABLE ORDER BY RAND() LIMIT 4000;
这需要时间……
一种更快的执行方式(不是编写代码!)可能是在一个循环中进行 4000 次单独的删除
DELETE FROM TABLE WHERE AssumedPKisInt = <ARandomNumber>
当然,您需要确保不要尝试删除不存在或已删除的行。
【讨论】: