it-swarm.it

Quali sono le principali differenze tra InnoDB e MyISAM?

Quali sono le principali differenze tra InnoDB e MyISAM?

255
ilhan

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 FULLTEXT indici 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 da crash.
  • MyISAM ha FULLTEXT indici di ricerca, InnoDB no fino a MySQL 5.6 (febbraio 2013).
  • InnoDB implementa transazioni, chiavi esterne e vincoli di relazione, MyISAM no.
165
poelinca

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 tuo 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 (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) indica 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 RAM e 16 GB di InnoDB, alloca 512M come innodb_buffer_pool.
  • Se hai 2 GB RAM e 4 GB di indici MyISAM, alloca 512M come key_buffer_size.
  • Se hai 2 GB 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 le connessioni DB e il sistema operativo.

89
RolandoMySQLDBA

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, tranne 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 COUNT(*) s (quando WHERE, GROUP BY O JOIN non viene utilizzato) viene eseguito più lentamente rispetto a MyISAM perché il conteggio delle righe non è memorizzato internamente . InnoDB memorizza 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:

  • veloce COUNT(*) s (quando WHERE, GROUP BY o JOIN non viene 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.

63
dabest1

Un po 'in ritardo al gioco ... ma ecco un abbastanza completo post che ho scritto qualche mese fa , che descrive 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 sono gestiti utilizzando le 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 danneggiare i 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 al di sotto della 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.

32
d4nyll

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 es. per consentire un mezzo standard per accedervi da un PHP, allora MyISAM va bene (cioè è meglio di un file CSV piatto o di un file di registro per le query e l'accesso simultaneo). Se il database è il "copia master" effettiva dei dati, se stai facendo INSERT e UPDATE utilizzando dati reali degli utenti, allora è sciocco usare qualsiasi cosa diversa da InnoDB, in qualsiasi tipo di scala MyISAM è inaffidabile e difficile da gestire, eseguirai myisamchk metà del tempo, annullando qualsiasi aumento delle prestazioni ...

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

31
Gaius

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.
19
bsoist

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
9
Patrick

Include le 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 dell'ottimizzatore persistente: fornisce una maggiore precisione delle statistiche dell'indice InnoDB e la coerenza tra i riavvii di MySQL.
  • Eliminazione della cache della tabella InnoDB: Per facilitare il caricamento della 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

Pertanto, non ha senso utilizzare MyISAM Engine se si è già passati a 5.6, altrimenti non attendere l'aggiornamento a MySQL 5.6.

prestazioni di InnoDB VS MyISAM usando MySQL 5.6

6
Mahesh Patil

[~ ~ #] 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.

6
Anto

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 ISAM. MyISAM è ottimizzato per ambienti con operazioni di lettura pesanti e poche scritture o nessuna. La ragione per cui MyISAM consente letture veloci è la struttura della sua 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 righe sono di lunghezza costante. area tipica in cui si potrebbe preferire MyISAM è il data warehouse, perché 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 inserti sono facili, perché nuove righe vengono aggiunti alla fine del file di dati. Tuttavia, le operazioni di eliminazione e aggiornamento sono più problematiche: le eliminazioni devono lasciare uno spazio vuoto o 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 ent righe e rivendica spazio vuoto, il comando OPTIMIZE TABLE 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, indici FULLTEXT e operazioni spaziali secondo 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.

4
wogsland