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.
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.
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
Đã đóng đinh nó! Cảm ơn – silkAdmin
Lưu ý rằng nó có thể xóa ít hơn 4000 hàng! –
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.
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
'DELETE FROM table WHERE id = RAND() LIMIT 4000'? :) hoặc 'RANDOM()'? cũng không chắc chắn;) – Vyktor