ype*_*eᵀᴹ 16
从理论上讲,这将是随机和快速的.在实践中,它只会很快:
DELETE FROM tableX
LIMIT 4000
Run Code Online (Sandbox Code Playgroud)
这将是随机但非常慢,有600K行:
DELETE FROM tableX
ORDER BY RAND()
LIMIT 4000
Run Code Online (Sandbox Code Playgroud)
这不是真正随机的(因为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
Run Code Online (Sandbox Code Playgroud)
解释输出(子查询的输出,来自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
Run Code Online (Sandbox Code Playgroud)