Quali sono le principali differenze tra InnoDB e MyISAM?


245

Quali sono le principali differenze tra InnoDB e MyISAM?


23
Se si desidera un motore di database, utilizzare InnoDB. Non puoi confrontare i due .
Jeremy Stein,

Mentre molte delle risposte di seguito sono corrette, non riducono chiaramente le cose, IMHO. Questo sito lo fa e il punto principale: InnoDB è il blocco a livello di riga, MyISAM è il blocco a livello di tabella. Ciò significa, in generale, MyISAM sarà migliore per OLAP (analisi, principalmente letture) e InnoDB sarà migliore per OLTP (transazioni, principalmente scritture o almeno molte scritture).
Mike Williamson,

Risposte:


159

La prima grande differenza che vedo è che InnoDB implementa il blocco a livello di riga mentre MyISAM può eseguire solo un blocco a livello di tabella. InnoDB troverai un migliore recupero degli arresti anomali. Tuttavia, non ha FULLTEXTindici di ricerca fino alla v5.6, come MyISAM. InnoDB implementa anche transazioni, chiavi esterne e vincoli di relazione mentre MyISAM no.

L'elenco può andare un po 'oltre. Tuttavia, entrambi hanno i loro vantaggi unici a loro favore e svantaggi l'uno contro l'altro. Ognuno di essi è più adatto in alcuni scenari rispetto agli altri.

Quindi per riassumere ( TL; DR ):

  • InnoDB ha il blocco a livello di riga, MyISAM può eseguire solo il blocco completo a livello di tabella.
  • InnoDB ha un migliore recupero degli arresti anomali.
  • MyISAM ha FULLTEXTindici di ricerca, InnoDB no fino a MySQL 5.6 (febbraio 2013).
  • InnoDB implementa transazioni, chiavi esterne e vincoli di relazione, MyISAM no.

caro signore, quindi alla fine cosa si dovrebbe usare? MyISAM o InnoDB? sono totalmente confuso ... il mio sito web utilizza mysql e devo decidere.
sqlchild,

3
dipende dall'applicazione, annota un elenco con le funzionalità di cui hai bisogno (es. ricerca full-text, chiavi esterne ...) e prova a sceglierne una (prova a valutare ciascuna funzione e poi a contare il punteggio). non sarai in grado di averli tutti ma spetta a te decidere di più la funzione delle streghe.
Poelinca,

2
Ho modificato il suo post per chiarimenti.
Mathias Lykkegaard Lorenzen,

1
@MathiasLykkegaardLorenzen grazie, questo è uno dei motivi per cui ci piace stackexchange
poelinca,

a partire da version 5.6.4InnoDB supporta la FULLTEXTricerca. dev.mysql.com/doc/refman/5.6/en/fulltext-rest restrizioni.html
sognatore ad occhi aperti

85

Un'altra importante differenza non ancora menzionata è la modalità di memorizzazione nella cache per ciascun motore di archiviazione.

MYISAM

Il meccanismo principale utilizzato è la cache delle chiavi. Memorizza solo le pagine indice dai file .MYI. Per dimensionare la cache delle chiavi, eseguire la query seguente:

SELECT CONCAT(ROUND(KBS/POWER(1024,
IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.4999),
SUBSTR(' KMG',IF(PowerOf1024<0,0,
IF(PowerOf1024>3,0,PowerOf1024))+1,1))
recommended_key_buffer_size FROM
(SELECT LEAST(POWER(2,32),KBS1) KBS
FROM (SELECT SUM(index_length) KBS1
FROM information_schema.tables
WHERE engine='MyISAM' AND
table_schema NOT IN ('information_schema','mysql')) AA ) A,
(SELECT 2 PowerOf1024) B;

Ciò fornirà l'impostazione consigliata per MyISAM Key Cache ( key_buffer_size ) dato il tuo set di dati corrente ( la query limiterà la raccomandazione a 4G (4096M). Per i sistemi operativi a 32 bit, 4 GB è il limite. Per 64 bit, 8 GB.

InnoDB

Il meccanismo principale utilizzato è il pool di buffer InnoDB. Memorizza le pagine dei dati e dell'indice dalle tabelle InnoDB a cui si accede. Per dimensionare il pool di buffer InnoDB, eseguire la query seguente:

SELECT CONCAT(ROUND(KBS/POWER(1024,
IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.49999),
SUBSTR(' KMG',IF(PowerOf1024<0,0,
IF(PowerOf1024>3,0,PowerOf1024))+1,1)) recommended_innodb_buffer_pool_size
FROM (SELECT SUM(data_length+index_length) KBS FROM information_schema.tables
WHERE engine='InnoDB') A,
(SELECT 2 PowerOf1024) B;

Ciò fornirà l'impostazione consigliata per la dimensione del pool di buffer InnoDB ( innodb_buffer_pool_size ) dato il set di dati corrente.

Non dimenticare di ridimensionare i file di registro di InnoDB (ib_logfile0 e ib_logfile1). Il codice sorgente MySQL pone un limite delle dimensioni combinate di tutti i file di registro InnoDB deve essere <4G (4096M). Per semplicità, dati solo due file di registro, ecco come puoi dimensionarli:

  • Passaggio 1) Aggiungi innodb_log_file_size = NNN a /etc/my.cnf (NNN dovrebbe essere il 25% di innodb_buffer_pool_size o 2047M, a seconda di quale sia minore)
  • Passo 2) service mysql stop
  • Passaggio 3) rm /var/log/mysql/ib_logfile[01]
  • Passaggio 4) service mysql start(vengono ricreati ib_logfile0 e ib_logfile1)

AVVERTIMENTO

Alla fine di entrambe le query è presente una query in linea (SELECT 2 PowerOf1024)B

  • (SELECT 0 PowerOf1024) fornisce l'impostazione in byte
  • (SELECT 1 PowerOf1024) fornisce l'impostazione in Kilobyte
  • (SELECT 2 PowerOf1024) fornisce l'impostazione in Megabyte
  • (SELECT 3 PowerOf1024) fornisce l'impostazione in Gigabyte
  • Non sono ammessi poteri inferiori a 0 o superiori a 3

EPILOGO

Non c'è sostituto per il buon senso. Se si dispone di memoria limitata, una combinazione di motori di archiviazione o una combinazione di questi, sarà necessario adattarsi a diversi scenari.

  • Se hai 2 GB di RAM e 16 GB di InnoDB, alloca 512M come innodb_buffer_pool.
  • Se si dispone di 2 GB di RAM e 4 GB di indici MyISAM, allocare 512 MB come key_buffer_size.
  • Se hai 2 GB di RAM e 4 GB di indici MyISAM e 16 GB di InnoDB, alloca 512M come key_buffer_size e 512M come innodb_buffer_pool_size.

I possibili scenari sono infiniti !!!

Ricorda, qualunque cosa tu stia assegnando, lascia abbastanza RAM per DB Connections e il sistema operativo.


Quelle sono formule sbagliate!
Rick James,

(oops - continua a dimenticare non puoi avere paragrafi) ... Aggiungerò una "risposta".
Rick James,

Le formule di Rolando per le dimensioni della cache non sono pratiche. - Non sono necessari poteri di 2. - 4 GB su un sistema operativo a 32 bit è impossibile - Ecc. Ecco il mio riassunto su cosa impostarli su: mysql.rjweb.org/doc.php/memory (Affronta varie altre impostazioni che influenzano l'uso della memoria.)
Rick James,

2
@Rick: i poteri di 2 avevano lo scopo di mostrare le risposte in diverse unità. Fare (SELEZIONA 2 PowerOfTwo) Imposta la visualizzazione della risposta in MB. Fare (SELEZIONA 3 PowerOfTwo) Imposta il display in GB. (SELEZIONA 1 PowerOfTwo) Viene visualizzato in KB. (SELEZIONA 0 PowerOfTwo) Viene visualizzato in byte. Ecco cosa fa (SELECT 2 PowerOfTwo). Quindi è necessario DISPLAY SOLO, non imporre alcun valore assunto nell'architettura.
RolandoMySQLDBA il

2
@Rick: sai cosa? In realtà ti darò un +1 per due ragioni molto grandi. 1) Il tuo URL conferma che la mia risposta era corretta in quanto 4 GB è il numero più grande da assegnare a key_buffer_size. 2) La tua risposta, con il tuo URL, ha senso per le macchine con memoria molto bassa. Darò credito dove è dovuto il credito.
RolandoMySQLDBA il

60

InnoDB offre:

  • Transazioni ACID
  • blocco a livello di riga
  • vincoli di chiave esterna
  • recupero automatico degli arresti anomali
  • compressione tabella (lettura / scrittura)
  • tipi di dati spaziali (nessun indice spaziale)

In InnoDB tutti i dati di fila, ad eccezione di TEXT e BLOB, possono occupare al massimo 8.000 byte. L'indicizzazione di testo completo non è disponibile in InnoDB fino a MySQL 5.6 (febbraio 2013). In InnoDB la COUNT(*)s (quando WHERE, GROUP BYo JOINnon viene utilizzata) viene eseguita più lentamente rispetto a MyISAM perché il conteggio delle righe non è memorizzato internamente. InnoDB archivia sia i dati che gli indici in un unico file. InnoDB utilizza un pool di buffer per memorizzare nella cache dati e indici.

MyISAM offre:

  • veloci COUNT(*)s (quando WHERE, GROUP BYo JOINnon è utilizzato)
  • indicizzazione di testo completo (aggiornamento: supportato in InnoDB da MySQL 5.6)
  • ingombro del disco ridotto
  • compressione della tabella molto alta (sola lettura)
  • tipi di dati spaziali e indici (R-tree) (aggiornamento: supportato in InnoDB da MySQL 5.7)

MyISAM ha un blocco a livello di tabella, ma nessun blocco a livello di riga. Nessuna transazione Nessun recupero automatico degli arresti anomali, ma offre funzionalità di tabella di riparazione. Nessun vincolo di chiave esterna. Le tabelle MyISAM sono generalmente di dimensioni più compatte su disco rispetto alle tabelle InnoDB. Le tabelle MyISAM potrebbero essere ulteriormente ridotte di dimensioni comprimendo con myisampack se necessario, ma diventano di sola lettura. MyISAM memorizza gli indici in un file e i dati in un altro. MyISAM utilizza buffer di chiavi per la memorizzazione nella cache degli indici e lascia la gestione della cache dei dati al sistema operativo.

Nel complesso, consiglierei InnoDB per la maggior parte degli scopi e MyISAM solo per usi specializzati. InnoDB è ora il motore predefinito nelle nuove versioni di MySQL.


5
Ho letto la tua risposta e l'ho confrontata con le altre già qui. Il tuo è l'unico a menzionare i BLOB. Di solito sono dati per scontati. Il tuo è anche l'unico che menziona myisampack, uno degli eroi sconosciuti dei tavoli MyISAM a lettura veloce. Il tuo è un +1 oggi !!!
RolandoMySQLDBA,

2
Esempio potrebbe essere una tabella di sola lettura compressa in cui sono presenti aggiornamenti non frequenti sostituendo completamente la tabella.
dabest1

30

Ancora una cosa: è possibile eseguire il backup delle tabelle di InnoDB semplicemente eseguendo un'istantanea del filesystem. Il backup di MyISAM richiede l'utilizzo di mysqldump e non è garantito che sia coerente (ad es. Se si inserisce in una tabella padre e figlio, è possibile che nel backup sia presente solo la riga della tabella figlio).

Fondamentalmente, se hai un'altra copia dei dati e li stai memorizzando nella cache solo in MySQL, ad esempio per consentire un mezzo standard per accedervi da un sito Web PHP, allora MyISAM va bene (cioè è meglio di un file CSV piatto o di un file di log per interrogare e accesso simultaneo). Se il database è l'effettiva "copia master" dei dati, se stai facendo INSERTe UPDATEusando dati reali dagli utenti, allora è sciocco usare qualsiasi cosa diversa da InnoDB, in qualsiasi tipo di scala MyISAM è inaffidabile e difficile da gestire, tu lo farò per myisamchkmetà del tempo, annullando qualsiasi miglioramento delle prestazioni ...

(La mia esperienza personale: un DB da 2 terabyte in MyISAM).


29

Un po 'tardi al gioco ... ma ecco un post abbastanza completo che ho scritto qualche mese fa , descrivendo in dettaglio le principali differenze tra MYISAM e InnoDB. Prendi una tazza (e forse un biscotto) e divertiti.


La principale differenza tra MyISAM e InnoDB sta nell'integrità referenziale e nelle transazioni. Esistono anche altre differenze come blocco, rollback e ricerche full-text.

Integrità referenziale

L'integrità referenziale garantisce che le relazioni tra le tabelle rimangano coerenti. Più specificamente, ciò significa che quando una tabella (ad es. Schede) ha una chiave esterna (ad es. ID prodotto) che punta a una tabella diversa (ad es. Prodotti), quando si verificano aggiornamenti o eliminazioni alla tabella puntata, queste modifiche vengono messe in cascata al collegamento tavolo. Nel nostro esempio, se un prodotto viene rinominato, anche le chiavi esterne della tabella di collegamento verranno aggiornate; se un prodotto viene eliminato dalla tabella "Prodotti", verranno eliminati anche tutti gli elenchi che puntano alla voce eliminata. Inoltre, ogni nuovo elenco deve avere quella chiave esterna che punta a una voce valida ed esistente.

InnoDB è un DBMS relazionale (RDBMS) e quindi ha integrità referenziale, mentre MyISAM no.

Transazioni e atomicità

I dati in una tabella vengono gestiti mediante istruzioni DML (Data Manipulation Language), come SELECT, INSERT, UPDATE e DELETE. Una transazione raggruppa due o più istruzioni DML insieme in una singola unità di lavoro, quindi viene applicata l'intera unità o nessuna di esse.

MyISAM non supporta le transazioni mentre InnoDB lo fa.

Se un'operazione viene interrotta durante l'utilizzo di una tabella MyISAM, l'operazione viene immediatamente interrotta e le righe (o anche i dati all'interno di ciascuna riga) interessate rimangono interessate, anche se l'operazione non è stata completata.

Se un'operazione viene interrotta durante l'utilizzo di una tabella InnoDB, poiché utilizza transazioni con atomicità, tutte le transazioni che non sono state completate non avranno effetto, poiché non viene eseguito alcun commit.

Blocco tabella vs Blocco riga

Quando una query viene eseguita su una tabella MyISAM, l'intera tabella in cui viene eseguita la query verrà bloccata. Ciò significa che le query successive verranno eseguite solo al termine di quella corrente. Se stai leggendo una tabella di grandi dimensioni e / o ci sono frequenti operazioni di lettura e scrittura, questo può significare un enorme arretrato di query.

Quando una query viene eseguita su una tabella InnoDB, vengono bloccate solo le righe interessate, il resto della tabella rimane disponibile per le operazioni CRUD. Ciò significa che le query possono essere eseguite contemporaneamente sulla stessa tabella, purché non utilizzino la stessa riga.

Questa funzione in InnoDB è nota come concorrenza. Per quanto la concorrenza sia, c'è un grosso svantaggio che si applica a un intervallo selezionato di tabelle, in quanto vi è un sovraccarico nel passaggio tra i thread del kernel e si dovrebbe impostare un limite sui thread del kernel per evitare che il server si fermi .

Transazioni e rollback

Quando si esegue un'operazione in MyISAM, le modifiche vengono impostate; in InnoDB, è possibile ripristinare tali modifiche. I comandi più comuni utilizzati per controllare le transazioni sono COMMIT, ROLLBACK e SAVEPOINT. 1. COMMIT: è possibile scrivere più operazioni DML, ma le modifiche verranno salvate solo quando viene effettuato un COMMIT 2. ROLLBACK: è possibile scartare qualsiasi operazione non ancora impegnata 3. SAVEPOINT: imposta un punto nell'elenco di operazioni a cui è possibile eseguire il rollback di un'operazione ROLLBACK

Affidabilità

MyISAM non offre integrità dei dati: guasti hardware, arresti non puliti e operazioni annullate possono causare la corruzione dei dati. Ciò richiederebbe la riparazione o la ricostruzione completa degli indici e delle tabelle.

InnoDB, d'altra parte, utilizza un registro delle transazioni, un buffer a doppia scrittura e checksum e validazione automatici per prevenire la corruzione. Prima che InnoDB apporti delle modifiche, registra i dati prima delle transazioni in un file di tablespace di sistema chiamato ibdata1. In caso di arresto anomalo, InnoDB eseguirà il recupero automatico tramite la riproduzione di tali registri.

Indicizzazione FULLTEXT

InnoDB non supporta l'indicizzazione FULLTEXT fino a MySQL versione 5.6.4. Al momento della stesura di questo post, la versione MySQL di molti provider di hosting condiviso è ancora inferiore a 5.6.4, il che significa che l'indicizzazione FULLTEXT non è supportata per le tabelle InnoDB.

Tuttavia, questo non è un motivo valido per utilizzare MyISAM. È meglio passare a un provider di hosting che supporti le versioni aggiornate di MySQL. Non che una tabella MyISAM che utilizza l'indicizzazione FULLTEXT non possa essere convertita in una tabella InnoDB.

Conclusione

In conclusione, InnoDB dovrebbe essere il motore di archiviazione predefinito scelto. Scegli MyISAM o altri tipi di dati quando soddisfano un'esigenza specifica.


1
Grazie, riassunto davvero informativo e chiaro.
informatik01,

18

Nella mia esperienza, la differenza più significativa è il modo in cui ciascun motore gestisce il bloccaggio. InnoDB utilizza il blocco delle righe mentre MyISAM utilizza il blocco delle tabelle. Come regola generale, uso InnoDB per scrivere tabelle pesanti e MyISAM per leggere tabelle pesanti.

Altre differenze importanti includono:

  1. Transazioni di supporto InnoDB e chiavi esterne. MyISAM no.
  2. MyISAM utilizza l'indicizzazione di testo completo.
  3. MyISAM fa un cattivo lavoro nel far rispettare l'integrità dei dati.

Non aggiornato - InnoDB ora ha FULLTEXTe SPATIAL. InnoDB è utile per carichi pesanti sia in lettura che in scrittura.
Rick James,

8

Tendo a vedere MyISAM come la scelta della tabella 'predefinita' per MySQL, quindi sottolineo le differenze per la maggior parte degli utenti di InnoDB

  • Blocco livello riga
  • Applicazione della chiave esterna
  • Supporto per le transazioni
  • Prestazioni elevate su sistemi ad alto utilizzo

5
tranne l'ultima versione di MySQL non utilizza più MyISAM come motore predefinito. In 5.5 hanno cambiato il valore predefinito in InnoDB :). E non sarei d'accordo con la generalizzazione secondo cui InnoDB in generale ottiene solo un "successo". Tabelle InnoDB ben progettate con indicizzazione corretta e impostazioni di memoria ben configurate possono far funzionare una tabella InnoDB e lo stesso schema in MyISAM
TechieGurl

3
In molte situazioni di "utilizzo intenso" InnoDB ha prestazioni migliori rispetto a MyISAM. MyISAM è uno strumento specifico per un problema specifico, mentre InnoDB ti servirà meglio nella maggior parte delle situazioni (quindi perché il team MySQL lo ha reso il motore predefinito). È perché MyISAM è stato l'unico motore per lungo tempo che la comunità MySQL ha preso l'abitudine di utilizzare MyISAM per impostazione predefinita, anche dopo la maturazione di InnoDB.
Nick Chammas,

2
La ricerca FULLTEXT per InnoDB è stata aggiunta nel corso del ciclo di sviluppo di MySQL 5.6. L'URL citato ora copre anche InnoDB.
Max Webster,

5

MYISAM

MYISAM fornisce il blocco a livello di tabella, la ricerca FULLTEXT. MYISAM ha la colonna AUTO_INCREMENTED più flessibile che gestisce tutti i motori di archiviazione. MYISAM non supporta le transazioni.

INNODB

INNODB è un motore di archiviazione sicuro per le transazioni. INNODB ha funzionalità di commit, rollback e crash-recovery. INNODB supporta l'integrità referenziale delle chiavi esterne.


5

Include modifiche a MySQL 5.6

MOTORE DI STOCCAGGIO INNODB:

  • Fornisce la piena conformità ACID (atomicità, coerenza, isolamento, durata). Il multi-versioning viene utilizzato per isolare le transazioni l'una dall'altra.
  • InnoDB fornisce il ripristino automatico dopo un arresto anomalo del server MySQL o dell'host su cui è in esecuzione il server.
  • InnoDB supporta chiavi esterne e integrità referenziale, tra cui eliminazioni e aggiornamenti in cascata.
  • MySQL 5.6 si basa sulla piattaforma di InnoDB completamente integrata come motore di archiviazione predefinito
  • Statistiche di ottimizzazione persistente : fornisce una maggiore precisione delle statistiche dell'indice InnoDB e la coerenza tra i riavvii di MySQL.
  • Eliminazione della cache di tabella InnoDB: per facilitare il carico di memoria su sistemi con un numero enorme di tabelle, InnoDB ora libera la memoria associata a una tabella aperta. Un algoritmo LRU seleziona le tabelle che sono andate più a lungo senza essere accessibili.
  • Supporta la ricerca full-text: un tipo speciale di indice, l'indice FULLTEXT, aiuta InnoDB a gestire le query e le operazioni DML che coinvolgono colonne basate su testo e le parole che contengono. Questi indici sono rappresentati fisicamente come intere tabelle InnoDB.
  • InnoDB sembra essere molto più veloce nella ricerca full-text rispetto a MyISAM

Quindi, non ha senso usare MyISAMEngine se sei già aggiornato a 5.6, altrimenti non aspettare l'aggiornamento a MySQL 5.6.

Prestazioni di InnoDB VS MyISAM usando MySQL 5.6


2

MyISAM

MyISAM è un motore di archiviazione per MySQL. Prima di MySQL 5.5 era il motore di archiviazione predefinito per MySQL. Si basa sul vecchio motore di archiviazione ISAM. MyISAM è ottimizzato per ambienti con operazioni di lettura pesanti e poche scritture o nessuna. Il motivo per cui MyISAM consente letture rapide è la struttura dei suoi indici: ogni voce punta a un record nel file di dati e il puntatore viene spostato dall'inizio del file. In questo modo i record possono essere letti rapidamente, specialmente quando il formato è FISSO. Pertanto, le file sono di lunghezza costante. Un'area tipica in cui si potrebbe preferire MyISAM è il data warehouse, poiché comporta query su tabelle molto grandi e l'aggiornamento di tali tabelle viene eseguito quando il database non è in uso (di solito di notte). Anche gli inserimenti sono facili, perché le nuove righe vengono aggiunte alla fine del file di dati. Però, le operazioni di eliminazione e aggiornamento sono più problematiche: le eliminazioni devono lasciare uno spazio vuoto, altrimenti gli offset delle righe cambieranno; lo stesso vale per gli aggiornamenti, poiché la lunghezza delle righe si riduce; se l'aggiornamento allunga la riga, la riga viene frammentata. Per deframmentare le righe e rivendicare spazio vuoto, ilOPTIMIZE TABLEil comando deve essere eseguito. A causa di questo semplice meccanismo, di solito le statistiche dell'indice MyISAM sono abbastanza accurate. Altri importanti svantaggi di MyISAM sono l'assenza di supporto per le transazioni e chiavi esterne.

InnoDB

InnoDB è un motore di archiviazione per MySQL. MySQL 5.5 e versioni successive lo utilizzano per impostazione predefinita. Fornisce le funzionalità di transazione standard conformi ACID, insieme al supporto di chiavi esterne (integrità dichiarativa dichiarativa). Implementa transazioni SQL e XA, tablespace, FULLTEXTindici e operazioni spaziali seguendo lo standard OpenGIS. È incluso come standard nella maggior parte dei file binari distribuiti da MySQL AB, ad eccezione di alcune versioni OEM. Il software ha una doppia licenza di Oracle Corporation; è distribuito sotto la GNU General Public License, ma può anche essere concesso in licenza alle parti che desiderano combinare InnoDB in software proprietario.

forchette

MariaDB ha un motore di archiviazione chiamato Aria, che viene descritto come "un'alternativa sicura a MyISAM". MariaDB e Percona Server utilizzano un fork di InnoDB chiamato XtraDB per impostazione predefinita. XtraDB è gestito da Percona. Le modifiche di Oracle InnoDB vengono regolarmente importate in XtraDB e vengono aggiunte alcune correzioni di bug e funzionalità extra.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.