Mam teraz tabelę, która ma 604 000 wierszy. Chciałbym rzucić 4000 losowych wierszy, więc mój stół będzie zawierał tylko 600 000 wpisów.Mysql Usuwanie wielu losowych wierszy ze stołu
Czy istnieje szybki sposób na zrobienie tego?
Wielkie dzięki.
Mam teraz tabelę, która ma 604 000 wierszy. Chciałbym rzucić 4000 losowych wierszy, więc mój stół będzie zawierał tylko 600 000 wpisów.Mysql Usuwanie wielu losowych wierszy ze stołu
Czy istnieje szybki sposób na zrobienie tego?
Wielkie dzięki.
Teoretycznie będzie to losowo i szybko. W praktyce będzie to tylko szybki:
DELETE FROM tableX
LIMIT 4000
To będzie przypadkowy, ale strasznie powolny, z 600k wierszy:
DELETE FROM tableX
ORDER BY RAND()
LIMIT 4000
nie będzie to naprawdę losowy (jak zwykle są luki w identyfikatorach) i może nawet nie usunąć dokładnie 4000 wierszy (ale o kilka mniej, gdy jest wiele przerw), ale prawdopodobnie jest szybszy niż poprzedni.
Dodatkowy owijania w podkwerendzie jest potrzebna, ponieważ składnia usunąć z wielu tabel nie pozwala 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
Wyjaśnić wyjście (podzapytania, z tabeli 400k wierszy):
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
Nailed to! Dzięki – silkAdmin
Pamiętaj, że może on usunąć mniej niż 4000 wierszy! –
DELETE FROM TABLE ORDER BY RAND() LIMIT 4000;
To zajmie czas mimo ...
Szybszym w ay do wykonania (nie pisać kod!) może być oddzielne Usuwa 4000 w pętli
DELETE FROM TABLE WHERE AssumedPKisInt = <ARandomNumber>
Oczywiście, trzeba upewnić się, że nie starają się usunąć lub nieistniejących już usuniętych wierszy.
Gdybym miał zgadywać:
DELETE FROM table where id = (SELECT id FROM table ORDER BY rand() LIMIT 1) LIMIT 10
'DELETE FROM tabela WHERE id = RAND() LIMIT 4000'? :) lub 'RANDOM()'? ani pewny;) – Vyktor