2012-01-26 11 views
7

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.

+1

'DELETE FROM tabela WHERE id = RAND() LIMIT 4000'? :) lub 'RANDOM()'? ani pewny;) – Vyktor

Odpowiedz

13

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

Nailed to! Dzięki – silkAdmin

+0

Pamiętaj, że może on usunąć mniej niż 4000 wierszy! –

1
delete from yourTable limit 4000 
+0

duh! Dzięki:) – silkAdmin

+1

Chciał to losowo.) – Vyktor

+0

to jest losowe. Nie możesz stwierdzić, które wiersze zostaną usunięte. –

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

0

Gdybym miał zgadywać:

DELETE FROM table where id = (SELECT id FROM table ORDER BY rand() LIMIT 1) LIMIT 10