Newsgroup: it.comp.os.linux.software
Titolo: MySQL: disabilitare gli indici temporaneamente

Salve,
ho una tabella InnoDB in un DB MySQL 4.1.5 con circa 15 milioni di righe.
Devo fare pulizia e cancellare una decina di milioni di quelle righe, ma
gia` il primo passaggio (circa 500.000 righe) ci sta mettendo una vita.
Presumo sia perche` ad ogni riga cancellata aggiorna gli indici.
Con le MyISAM si possono disabilitare con alter table...disable keys; ma
con le InnoDB non funziona.
C'e` un sistema per accelerare l'operazione?
Attualmente uso comandi cosi` per cancellare le righe:
delete from tabelle where campo1 = 'XX' and campo2 < 100000;
Devo ripeterlo una trentina di volte con XX (codice di due lettere
maiuscole) che cambia, e campo2 di conseguenza. (E` una tabella che
contiene riferimenti incrociati tra altre tabelle, che ora sono state
svuotate).
Grazie.

 delete from tabelle where campo1 = 'XX' and campo2 < 100000;
...
Hai modo di controllare se per caso su mysql 5.0.x (l'ultima che installa debian 
unstable) lo hanno implementato?
Mi pare di avere visto che dalla 4 alla 5 cambiano parecchie cose.
-- 
Faciait li signeur!
Roy Batty

 installa debian unstable) lo hanno implementato?
No, mi spiace. E` un server in produzione con Debian sarge. Mi sono
concesso il lusso del 4.1 da backports, ma il 5 ancora no. :)
Bye.

 C'e` un sistema per accelerare l'operazione?
Visto che sono più i dati da cancellare che quelli da tenere, non puoi
copiare i dati buoni in un nuova tabella, segare la vecchia e
rinominare la nuova ?
Ciao.
-- 
*** Linux user # 198661 --- ICQ 33500725 ***
***  Home  
http://web.tiscali.it/kailed
  ***
       ***  Powered by SuSeLinux  ***

 rinominare la nuova ?
Grazie per il suggerimento, ma non mi fido. :)
L'applicazione non l'ho scritta io, e non so quali incroci di id faccia,
quindi per andare sul sicuro preferisco eliminare quello che so che posso
eliminare, piuttosto che rischiare di rinominare quello che non deve
essere rinominato. :)
Pazienza, mi sorbiro` questo strazio.
Per la cronaca, per ogni lingua (tale e` il codice di due caratteri) ci
mette circa 45 minuti, per cancellare circa 500.000 righe. Per fortuna che
MySQL dovrebbe essere veloce... :/
Bye.

 MySQL dovrebbe essere veloce... :/
Vabe' e` risaputo che in qualsiasi db o indexed ... l'operazione piu' lenta e` 
la cancellazione.


 la cancellazione.
OK, ma qui peggiora di volta in volta. Non ho mai fatto cancellazioni
cosi` grosse, ma e` normale?
Questo e` il risultato dell'ultimo "giro" (la settima lingua cancellata,
ne mancano ancora una quindicina):
Query OK, 664555 rows affected (1 hour 31 min 36.99 sec)
Quella prima 1 ora e 26, e prima 54 minuti.
Grazie.

 
Sei sotto transazione? Se no, devi esserlo e vedrai che l'operazione sarà
quasi immediata.

 sarà quasi immediata.
Ci ho provato, ma sembra che dalla linea di comando non accetti le
transazioni. Ho provato a impostare "set autocommit=0" e poi fare un
begin, ma mi dice solo "0 rows affected".
Faro` altri esperimenti, grazie del suggerimento, comunque.
Bye.

 Bye.
Ciao,
Michele

 Quella prima 1 ora e 26, e prima 54 minuti.


Alessandro Pellizzari ha scritto:

Il problema è quello: se sei in autocommit mode, le operazioni sono
per forza di cose molto più lente (e per molto intendo MOLTO). Dalla
linea di comando deve funzionare normalmente...la giusta sequenza è:
set autocommit=0;
begin;
delete from latuatabella where ....;
commit;
Ad ogni comando che non manipola records, ti dice "0 rows affected", è
normale. La delete ti dirà quanti record ha cancellato.
Ciao

 linea di comando deve funzionare normalmente...la giusta sequenza è:
Si`, l'avevo provata, poi l'ho bloccata perche` la delete ci stava
mettendo troppo e stavo tornando a casa.
Adesso l'ho lanciato e vediamo quanto ci mette.
Spero che poi il commit non ci metta tanto di suo. ;)
Bye.
P.S. per Michele: avevo pensato anche a uno scriptino in Python, ma oggi
non ho avuto tempo di farlo, anche perche` non ho mai usato mysql con
python e non c'era installato il modulo mysql per python sul server.
Grazie comunque per il suggerimento.