Ci sono delle insidie ??/ cose che devi sapere quando passi da MyISAM a InnoDB
-
03-07-2019 - |
Domanda
Uno dei miei progetti utilizza il motore MyISAM in MySQL, ma sto pensando di cambiarlo in InnoDB poiché ho bisogno del supporto delle transazioni qua e là.
- Cosa devo guardare o considerare prima di farlo?
- Posso semplicemente cambiare il motore o i dati devono essere preparati per questo?
Soluzione
Sì, assolutamente, ci sono molte cose, dovresti testare la tua applicazione in modo estremamente approfondito:
- Le transazioni possono deadlock e devono essere ripetute. Questo è il caso (in alcune circostanze) anche con una transazione automatica che inserisce solo una riga.
- L'utilizzo del disco aumenterà quasi sicuramente
- Il carico di I / O durante le scritture aumenterà quasi sicuramente
- Il comportamento dell'indicizzazione cambierà perché InnoDB utilizza indici cluster: in alcuni casi questo potrebbe essere un effetto benefico
- La tua strategia di backup sarà influenzata. Consideralo attentamente.
Il processo di migrazione stesso dovrà essere pianificato con cura, poiché ci vorrà molto tempo se si dispone di molti dati (durante i quali i dati saranno di sola lettura o completamente non disponibili - controllare!)
Altri suggerimenti
C'è un grande avvertimento. Se si verifica un errore hardware (o simile) durante una scrittura, InnoDB corromperà le tabelle.
Anche MyISAM lo farà, ma un mysqlcheck - auto-repair li riparerà. Provare questo con le tabelle InnoDB fallirà. Sì, questo è per esperienza.
Ciò significa che è necessario disporre di un buon piano di backup dei dati per utilizzare InnoDB.
Alcune altre note:
InnoDB non rialloca lo spazio libero sul filesystem dopo aver eliminato una tabella / database o eliminato un record, questo può essere risolto "scaricando e importando" o impostando innodb_file_per_table = 1
in my.cnf.
L'aggiunta / rimozione di indici su una grande tabella InnoDB può essere piuttosto dolorosa, poiché blocca la tabella corrente, ne crea una temporanea con gli indici modificati e inserisce i dati riga per riga. Esiste un di Innobase , ma funziona solo per MySQL 5.1
InnoDB è anche MOLTO PIÙ intensa per la memoria, ti suggerisco di avere la variabile innodb_buffer_pool_size
grande quanto la tua memoria server consente (il 70-80% dovrebbe essere una scommessa sicura). Se il tuo server è UNIX / Linux, considera di ridurre la variabile sysctl vm.swappiness
a 0 e usa innodb_flush_method = O_DIRECT
per evitare il doppio buffering. Verifica sempre se premi swap quando attivi o disattiva questi valori. Puoi sempre leggere di più su Blog di Percona , il che è fantastico.
Inoltre, puoi eseguire mysqlbackup
con --single-transazione --skip-lock-tables
e non avere blocchi di tabella mentre il backup sta iniziando.
In ogni caso, InnoDB è fantastico, non lasciare che alcune insidie ??ti scoraggino.
Basta modificare la tabella e impostare il motore dovrebbe andare bene.
- Uno dei più importanti a cui prestare attenzione è che
select count (*) da MyTable
è molto più lento in InnoDB rispetto a MyISAM.
- i valori di auto_increment verranno reimpostati sul valore più alto nella tabella +1 dopo il riavvio del server - questo può causare problemi divertenti se si ha un db disordinato con alcune eliminazioni.
- Le impostazioni ottimali del server saranno diverse da un db principalmente MyISAM.
- Assicurati che la dimensione del file innodb sia abbastanza grande da contenere tutti i tuoi dati o sarai crocifisso da una riallocazione costante quando cambi i motori delle tabelle.
Se si intende utilizzare InnoDB come metodo per ottenere query simultanee, è necessario impostare innodb_file_trx_commit = 1
in modo da ottenere alcune prestazioni. OTOH, se stavi cercando di ricodificare la tua applicazione per essere a conoscenza delle transazioni, decidere che questa impostazione farà parte della revisione generale delle prestazioni necessaria delle impostazioni di InnoDB.
L'altra cosa importante a cui prestare attenzione è che InnoDB non supporta gli indici FullText, né INSERT RITARDATO. Ma poi, MyISAM non supporta l'integrità referenziale. : -)
Tuttavia, puoi spostare solo le tabelle di cui hai bisogno per le transazioni. L'ho fatto. Le piccole tabelle (fino a diverse migliaia di righe) possono spesso essere modificate al volo, per inciso.
Le caratteristiche prestazionali possono essere diverse, quindi potrebbe essere necessario tenere d'occhio il carico.
I dati andranno bene.