2012-01-26 38 views
7

Bây giờ tôi có một bảng có 604 000 hàng. Tôi muốn thả 4000 hàng ngẫu nhiên để bảng của tôi sẽ chỉ chứa 600 000 mục.Mysql Xóa nhiều hàng ngẫu nhiên khỏi một bảng

Có cách nào nhanh chóng để làm như vậy không?

Cảm ơn rất nhiều.

+1

'DELETE FROM table WHERE id = RAND() LIMIT 4000'? :) hoặc 'RANDOM()'? cũng không chắc chắn;) – Vyktor

Trả lời

13

Về lý thuyết, điều này sẽ ngẫu nhiên và nhanh chóng. Trong thực tế, nó sẽ chỉ nhanh:

DELETE FROM tableX 
LIMIT 4000 

Đây sẽ là ngẫu nhiên nhưng cực kỳ chậm, với 600K hàng:

DELETE FROM tableX 
ORDER BY RAND() 
LIMIT 4000 

này sẽ không thể thực sự ngẫu nhiên (như thường có khoảng trống trong các id) và nó thậm chí có thể không xóa chính xác 4000 hàng (nhưng ít hơn một chút khi có nhiều khoảng trống) nhưng nó có thể nhanh hơn so với trước đó.

Một gói phụ trong một subquery là cần thiết vì cú pháp cho Xóa từ nhiều bảng không cho phép 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 

Giải thích đầu ra (của subquery, từ một bảng 400K hàng):

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

Đã đóng đinh nó! Cảm ơn – silkAdmin

+0

Lưu ý rằng nó có thể xóa ít hơn 4000 hàng! –

1
delete from yourTable limit 4000 
+0

duh! Cảm ơn:) – silkAdmin

+1

Ông muốn nó ngẫu nhiên.) – Vyktor

+0

điều này là ngẫu nhiên. Bạn không thể cho biết những hàng nào sẽ bị xóa. –

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

Nó sẽ mất thời gian mặc dù ...

Một nhanh w ay để thực hiện (không phải viết mã!) có thể là 4000 lần xóa riêng biệt trong một vòng lặp

DELETE FROM TABLE WHERE AssumedPKisInt = <ARandomNumber> 

Tất nhiên, bạn cần đảm bảo bạn không cố xóa các hàng không tồn tại hoặc đã bị xóa.

0

Nếu tôi phải mạo hiểm một đoán:

DELETE FROM table where id = (SELECT id FROM table ORDER BY rand() LIMIT 1) LIMIT 10 
Các vấn đề liên quan