Qual è la differenza tra InnoDB e MyISAM?


17

Sto usando MySQL come database per il mio attuale progetto web. Sono nuovo di MySQL. Per favore, spiegami la differenza tra InnoDB e MyISAM.


sentiti libero di aggiungere anche un tagg di MySQL :)
Johan,

Non appartiene a StackOverflow?
ripper234,

@ ripper234. Su SO esistono due versioni migliori di questo post (molto più background; più dimostrazioni di ricerche precedenti): stackoverflow.com/q/12614541/209139 e stackoverflow.com/q/20148/209139 .
TRiG

Risposte:


14

ISAM = Metodo di accesso sequenziale indicizzato ed è essenzialmente un file flat (per quei DBA che possono ricordare, pensare a Btrieve o B-Tree). È una tecnologia molto vecchia, ma non lasciarti scoraggiare dall'utilizzarla. Poiché si tratta di un file flat (ne parleremo più avanti), non è relazionale e quindi non è un RDBMS, quindi è più appropriato in alcune situazioni.

InnoDB è l'RDBMS completo come probabilmente hai familiarità. MyISAM può sembrare relazionale attraverso un altro livello aggiunto in cima che mantiene i collegamenti, la logica e l'integrità referenziale.

ISAM è geniale se hai MOLTO record (come 20 milioni) e i record sono per lo più autonomi (cioè non è necessario fare molti collegamenti per recuperare i dati associati). Si basa MOLTO pesantemente sugli indici e se non si dispone dell'indice giusto, prepararsi per tempi di interrogazione molto lunghi. Caso in questione: avevamo una tabella ISAM Btrieve con oltre 20 milioni di record e il recupero e il filtraggio dei dati in base a un indice accurato era quasi istantaneo. L'uso dell'indice sbagliato è stato letteralmente 15 minuti.

InnoDB è ottimo se hai molti collegamenti relazionali. La tabella A fa riferimento a un campo nella tabella B, che fa riferimento alle tabelle C e D. InnoDB può recuperare questi record utilizzando tutti i tipi di metodi di giunzione (hash join, ecc.), Mentre un database ISAM dovrebbe eseguire più query secondarie per ogni singolo remare e abbinare i record manualmente.

Dovrai davvero fare un corso in database se vuoi molti più dettagli di così!


ISAM è relazionale come qualsiasi altra cosa, non è ottimizzato per questo.
LapTop006,

grazie 4 la tua breve descrizione. Ora sostanzialmente sono stato cancellato

5

Il più fondamentale è che InnoDB è transazionale. MyIsam non lo è. MyIsam è generalmente un po 'più veloce, quindi se non hai bisogno di transazioni in genere è la soluzione migliore. Per descrizioni dettagliate dovresti leggere la documentazione di MySQL.


2

In questi giorni, a meno che non si stia utilizzando una tabella per i dati di stile del registro (molti più INSERT quindi SELECT, nessuna transazione) InnoDB è in genere più veloce, più affidabile, ha più funzionalità, ecc.

L'unica altra caratteristica di MyISAM è la ricerca full-text che va bene per l'uso di base, ma la maggior parte delle persone usa alcuni di Lucene per qualcosa di serio.

In entrambi i casi è necessario ottimizzare MySQL poiché le impostazioni predefinite sono essenzialmente impostate per un pentium da 32 MB condiviso con altri servizi.


2

Un po 'in ritardo 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 si sovrappongono 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 usando 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, esiste un grave svantaggio che si applica a un intervallo selezionato di tabelle, in quanto esiste un sovraccarico nel passaggio tra i thread del kernel e si dovrebbe impostare un limite per i 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 transazionale, 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 ripristino 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

Generalmente, la regola empirica è, se vuoi la velocità, usa MyISAM e se vuoi la stabilità, usa InnoDB. Qualcosa a che fare con l'atomicità se ricordo bene.


3
Tranne che non è più vero, InnoDB è in realtà più veloce nella maggior parte dei casi.
LapTop006,

1
qualcuno può aggiungere un link alcuni benchmark o qualcosa del genere ...?
Johan,
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.