[英]Mysql Deleting multiple random row from a table
我現在有一張有604 000行的表。 我想刪掉4000個隨機行,所以我的表只包含60萬個條目。
會有快速的方法嗎?
非常感謝。
從理論上講,這將是隨機和快速的。 在實踐中,它只會很快:
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
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>
當然,您需要確保不要嘗試刪除不存在或已刪除的行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.