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?
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top