これでテーブルが604 000行になりました。私はテーブルに600 000のエントリしか含まれないように4000個のランダムな行を削除したいと思います。Mysqlテーブルから複数のランダムな行を削除する
これを行う簡単な方法はありますか?
ありがとうございます。
これでテーブルが604 000行になりました。私はテーブルに600 000のエントリしか含まれないように4000個のランダムな行を削除したいと思います。Mysqlテーブルから複数のランダムな行を削除する
これを行う簡単な方法はありますか?
ありがとうございます。
理論上、これはランダムかつ高速です。実際には、それだけで速くなります。
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
それを釘付け!ありがとう – silkAdmin
それは4000行未満を削除するかもしれないことに注意してください! –
DELETE FROM TABLE ORDER BY RAND() LIMIT 4000;
これは、しかし...
迅速ワットの時間を取りますよAYがループもちろん
DELETE FROM TABLE WHERE AssumedPKisInt = <ARandomNumber>
で4000の別々の削除も可能(コードを記述しないで!)を実行するために、あなたは存在しないか、すでに削除された行を削除しようとしていないことを確認する必要があります。
私は推測を思い切ってしなければならなかった場合:
DELETE FROM table where id = (SELECT id FROM table ORDER BY rand() LIMIT 1) LIMIT 10
'DELETEテーブルからID = RAND()LIMITを4000'? :)または 'RANDOM()'?確かではありません;) – Vyktor