2012-01-26 36 views
7

これでテーブルが604 000行になりました。私はテーブルに600 000のエントリしか含まれないように4000個のランダムな行を削除したいと思います。Mysqlテーブルから複数のランダムな行を削除する

これを行う簡単な方法はありますか?

ありがとうございます。

+1

'DELETEテーブルからID = RAND()LIMITを4000'? :)または 'RANDOM()'?確かではありません;) – Vyktor

答えて

13

理論上、これはランダムかつ高速です。実際には、それだけで速くなります。

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 
+0

それを釘付け!ありがとう – silkAdmin

+0

それは4000行未満を削除するかもしれないことに注意してください! –

1
delete from yourTable limit 4000 
+0

duh!ありがとう:) – silkAdmin

+1

彼はそれがランダムに望んでいた。 – Vyktor

+0

これはランダムです。どの行が削除されるかはわかりません。 –

0
DELETE FROM TABLE ORDER BY RAND() LIMIT 4000; 

これは、しかし...

迅速ワットの時間を取りますよAYがループもちろん

DELETE FROM TABLE WHERE AssumedPKisInt = <ARandomNumber> 

で4000の別々の削除も可能(コードを記述しないで!)を実行するために、あなたは存在しないか、すでに削除された行を削除しようとしていないことを確認する必要があります。

0

私は推測を思い切ってしなければならなかった場合:

DELETE FROM table where id = (SELECT id FROM table ORDER BY rand() LIMIT 1) LIMIT 10 
関連する問題