Quali sono le principali differenze tra InnoDB e MyISAM?
Quali sono le principali differenze tra InnoDB e MyISAM?
Risposte:
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 ):
FULLTEXT
indici di ricerca, InnoDB no fino a MySQL 5.6 (febbraio 2013).version 5.6.4
InnoDB supporta la FULLTEXT
ricerca. dev.mysql.com/doc/refman/5.6/en/fulltext-rest restrizioni.html
Un'altra importante differenza non ancora menzionata è la modalità di memorizzazione nella cache per ciascun motore di archiviazione.
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.
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:
service mysql stop
rm /var/log/mysql/ib_logfile[01]
service mysql start
(vengono ricreati ib_logfile0 e ib_logfile1)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 GigabyteNon 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.
I possibili scenari sono infiniti !!!
Ricorda, qualunque cosa tu stia assegnando, lascia abbastanza RAM per DB Connections e il sistema operativo.
InnoDB offre:
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 BY
o JOIN
non 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:
COUNT(*)
s (quando WHERE
, GROUP BY
o JOIN
non è utilizzato)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.
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 INSERT
e UPDATE
usando 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 myisamchk
metà del tempo, annullando qualsiasi miglioramento delle prestazioni ...
(La mia esperienza personale: un DB da 2 terabyte in MyISAM).
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.
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.
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.
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 .
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
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.
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.
In conclusione, InnoDB dovrebbe essere il motore di archiviazione predefinito scelto. Scegli MyISAM o altri tipi di dati quando soddisfano un'esigenza specifica.
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:
FULLTEXT
e SPATIAL
. InnoDB è utile per carichi pesanti sia in lettura che in scrittura.
Tendo a vedere MyISAM come la scelta della tabella 'predefinita' per MySQL, quindi sottolineo le differenze per la maggior parte degli utenti di InnoDB
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.
Include modifiche a MySQL 5.6
MOTORE DI STOCCAGGIO INNODB:
Quindi, non ha senso usare MyISAM
Engine se sei già aggiornato a 5.6, altrimenti non aspettare l'aggiornamento a MySQL 5.6.
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 TABLE
il 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 è 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, FULLTEXT
indici 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.
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.