Per quanto riguarda MySQL, sarebbe difficile comprendere MyISAM e InnoDB, che sono due dei motori di archiviazione MySQL più conosciuti e ampiamente utilizzati. Oggi vi parlerò della differenza tra MyISAM e InnoDB in MySQL...
Cos'è MyISAM?
MyISAM è il motore di archiviazione predefinito per il sistema di gestione database relazionale MySQL (prima della versione 5.5)。 Questa struttura di archiviazione MySQL estende molte funzionalità utili rispetto al vecchio codice ISAM. Nella nuova versione di MySQL, il motore InnoDB sta ampiamente sostituendo MyISAM grazie ai suoi vantaggi in termini di transazioni, integrità referenziale e maggiore concorrenza. Ogni tabella MyISAM corrisponde a tre file sul disco rigido. Tutti e tre i file hanno lo stesso nome file, ma estensioni diverse per indicare il loro scopo tipo: il file .frm contiene la definizione della tabella, ma questo file non fa parte del motore MyISAM, bensì del server; .MYD contiene i dati della tabella; .MYI è il file indice della tabella.
Cos'è InnoDB?
InnoDB è un altro motore di storage per MySQL, e la nuova versione dello standard rilasciato da MySQL AB è inclusa in tutti i pacchetti di installazione binari.Dalla 5.5 in poi come motore di storage predefinito。 I suoi vantaggi rispetto ad altri motori di storage sono il supporto per transazioni compatibili con ACID (simile a PostgreSQL) e l'integrità dei parametri (cioè il supporto per chiavi straniere).
Oracle Corporation ha acquisito Innobase nell'ottobre 2005. Innobase utilizza l'autorizzazione di autenticazione doppia. Viene distribuito tramite GNU e consente anche ad altri gruppi che desiderano incorporare InnoDB nel software commerciale di ottenere una licenza.
I motori di storage più popolari sono MyISAM e InnoDB. Le principali differenze tra MyISAM e InnoDB riguardano le prestazioni e il controllo delle transazioni. MyISAM è un'implementazione estesa del primo ISAM (Indexed Sequential Access Method, ISAM non è più supportato dopo MySQL 5.0), ISAM è progettato per gestire situazioni in cui la frequenza di lettura è molto superiore a quella di scrittura, quindi ISAM e successivamente MyISAM non considerano il supporto di cose, escludono TPM, non necessitano di record di transazione, l'efficienza delle query ISAM è notevole e il consumo di memoria è molto piccolo. MyISAM eredita questi benefici pur mantenendosi aggiornato con un gran numero di nuove funzionalità utili e strumenti correlati. Ad esempio, considerando il controllo della concorrenza, sono forniti lock a livello di tabella e, sebbene MyISAM stesso non supporti la tolleranza ai guasti, può essere utilizzato per recuperare da guasti tramite myisamchk. E poiché MyISAM utilizza i propri file di memoria indipendenti (file dati MYD e file indice MYI) per ogni tabella, è molto comodo fare backup e ripristinare (la sovrascrittura di copia è sufficiente), e supporta anche il recupero online. Rispetto ad altri motori di storage, MyISAM ha la maggior parte degli strumenti per controllare e riparare tabelle. Le tabelle MyISAM possono essere compresse e supportano la ricerca fulltext. Non sono sicure per transazioni e non supportano chiavi estere, quindi se la tua applicazione non richiede transazioni e gestisce solo operazioni CRUD di base, MyISAM è la soluzione migliore. InnoDB è progettato per situazioni di lettura e scrittura ad alta concorrenza, utilizzando MVCC (Multi-Version Concurrency Control) e locks a livello di riga per fornire supporto alle transazioni conformi a ACID. InnoDB supporta l'integrità dei riferimenti di chiave esterna e dispone di capacità di recupero dai guasti. Inoltre, le prestazioni di InnoDB sono in realtà piuttosto buone, specialmente quando si elaborano grandi quantità di dati, in termini ufficiali: l'efficienza CPU di InnoDB è incomparabile a quella di altri motori di storage relazionali basati su disco. Tuttavia, il backup e il recupero di InnoDB sono un po' più complicati, a meno che non si utilizzi il supporto Mulit-tablespace fornito dalla versione 4.1 o successiva, perché a differenza di MyISAM, i file dati di InnoDB non corrispondono indipendentemente a ogni tabella. Invece, viene utilizzato lo spazio condiviso della tabella e il semplice metodo di sovrascrittura di copia non è adatto a lui, e i dati devono essere ripristinati dopo aver fermato MYSQL. Usando tabella-tabelle per tabelle, ogni tabella corrisponde a un file separato, la situazione è molto più semplice. Ha le stesse caratteristiche dei tipi BDB e supportano anche chiavi straniere. Le tabelle InnoDB sono veloci e hanno funzionalità più ricche rispetto a BDB, quindi è consigliata se hai bisogno di un motore di storage sicuro a livello transazionale.
In generale, InnoDB è una buona scelta se è necessario il supporto alle transazioni e ha un'alta frequenza di lettura e scrittura simultanea. BDB può essere considerato se la frequenza delle letture e scritture concorrenti non è alta, ma BDB non sarà più supportato in MySQL 5.1 e versioni successive. Questa opzione è sparita
Per impostazione predefinita, le transazioni InnoDB sono aperte (imposta autocommit = 0), il che significa che ogni volta che viene inserito un record, la tabella InnoDB lo tratterà come una transazione separata. Quindi, se inseriamo 10.000 record e non chiudiamo la transazione, la tabella di tipo InnoDB la tratterà come 10.000 transazioni, e il tempo totale di inserimento in questo momento è molto, a questo punto dobbiamo prima disattivare la transazione e poi inserirla, quindi la velocità sarà molto alta. Per quanto riguarda Heap e BDB (Berkeley DB), relativamente parlando, il tasso di penetrazione non è buono come nei due precedenti, ma in alcuni casi, Il motore di memoria heap è ancora molto applicabile, memorizza i dati in memoria, ed è estremamente veloce perché non c'è I/O del disco in attesa. Ma essendo un motore di memoria memorizzata, qualsiasi modifica scomparirà dopo il riavvio del server. Heap è un ottimo posto per usare BDB per i test, essendo il primo motore di storage sicuro transazionalmente di MySQL. Costruito sulla base della libreria di database di Berkeley DB, è anche sicuro dal punto di vista transazionale, ma BDB ovviamente non è popolare come InnoDB, perché la maggior parte dei motori di storage in MySQL che supportano le transazioni cerca anche MVCC o motori di storage a livello di riga, mentre BDB supporta solo il blocco a livello di pagina.
Motore InnoDB
InnoDB è un motore di archiviazione transazionale che supporta i rollback ed è progettato per fornire servizi ad alte prestazioni durante l'elaborazione di grandi quantità di dati, e stabilisce pool di buffer in memoria a tempo di esecuzione per buffiare dati e indici.
Vantaggi del motore InnoDB:
1. Supporta l'elaborazione delle transazioni e le funzionalità di transazione ACID;
2. Vengono realizzati quattro livelli di isolamento dello standard SQL;
3. Supportare vincoli a livello di riga e chiave esterna;
4. Puoi usare i log delle transazioni per il recupero dati.
5. Il livello di blocco è lock a riga, adatto per frequenti modifiche di tabelle con alta concorrenza, e alta concorrenza è migliore di MyISAM. Lo svantaggio è che il consumo di sistema è elevato.
6. L'indice non solo memorizza in cache se stesso, ma mette anche i dati, il che richiede più memoria rispetto a MyISAM.
Svantaggi del motore InnoDB:
Poiché non salva il numero di righe nella tabella, l'intera tabella viene scansionata utilizzando le statistiche COUNT.
Motore MyISAM
MyISAM è il motore predefinito prima di MySQL 5.5.5 ed è progettato per leggere velocemente.
Vantaggi del motore MyISAM:
1. Lettura ad alte prestazioni;
2. Poiché salva il numero di righe nella tabella, l'intera tabella non verrà scansionata utilizzando le statistiche COUNT;
Svantaggi del motore MyISAM:
1. Il livello della serratura è una serratura da tavolo, e il vantaggio della serratura dell'orologio è che la serratura è piccola e la serratura è veloce; Gli svantaggi sono che la granularità del lock è elevata, la probabilità di impulso del lock è elevata e la capacità di concorrenza è bassa, il che è adatto ai servizi basati su query.
2. Questo motore non supporta transazioni o chiavi estere.
3. Le operazioni INSERT e UPDATE devono bloccare l'intera tabella;
4. Memorizza il numero di righe nella tabella, quindi quando SELECT COUNT(*) dalla tabella deve solo leggere direttamente i valori salvati senza scansionare l'intera tabella.
Scenari applicabili
MyISAM è adatto per: (1) effettuare molti calcoli di conteggio; (2) Inserzioni poco frequenti e richieste molto frequenti; (3) Non c'è affari.
InnoDB è adatto per: (1) elevati requisiti di affidabilità o transazioni; (2) Gli aggiornamenti e le query delle tabelle sono piuttosto frequenti e la probabilità di blocco delle tabelle è relativamente alta.
Confronto delle tabelle
| Proprietà | MyISAM | Mucchio | BDB | InnoDB | | Transazioni | Non supportato | Non supportato | Tra i fan | Tra i fan | | Granularità del lock | Bloccato del tavolo | Bloccato del tavolo | Blocco pagina (pagina, 8KB) | Serratura | | immagazzinamento | File divisi | In memoria | Un file per tabella | Spazio della tabella | | Livello di isolamento | non | non | Leggi Impegnato | Tutti | | Formato portatile | essere | N/A | non | essere | | Completezza delle citazioni | non | non | non | essere | | Chiave primaria dei dati | non | non | essere | essere | | MySQL memorizza nella cache i record dei dati | non | Sì | Sì | Sì | | usabilità | Versione completa | Versione completa | MySQL-Max | Versione completa |
Alcune differenze nei dettagli
1. InnoDB non supporta indici di tipo FULLTEXT, supportati fin da MySQL 5.6 (sperimentale).
2. InnoDB non salva il numero specifico di righe della tabella, cioè, quando si esegue select count() dalla tabella, InnoDB deve scansionare l'intera tabella per calcolare quante righe ci sono, ma MyISAM deve semplicemente leggere il numero di righe salvate. Si noti che quando la sentenzia count() contiene una condizione where, l'operazione è la stessa per entrambe le tabelle.
3. Per campi di AUTO_INCREMENT tipo, InnoDB deve contenere un indice con solo quel campo, ma nella tabella MyISAM puoi creare un indice congiunto con altri campi.
4. Quando ELIMINA DA la tabella, InnoDB non ricrea la tabella, ma la elimina riga per riga.
5. L'operazione LOAD TABLE FROM MASTER non funziona per InnoDB, la soluzione è prima cambiare la tabella InnoDB con la MyISAM, importare i dati e poi cambiarla nella tabella InnoDB, ma non è applicabile alla tabella che utilizza funzionalità aggiuntive di InnoDB (come chiavi esterne).
6. Inoltre, il blocco di riga della tabella InnoDB non è assoluto; se MySQL non può determinare l'intervallo da scansionare durante l'esecuzione di un'istruzione SQL, la tabella InnoDB bloccherà anche l'intera tabella.
7. InnoDB non supporta l'indicizzazione del testo completo, mentre MyISAM sì. L'indicizzazione del testo completo si riferisce alla creazione di un indice in ordine inverso di ogni parola in carattere, varchar e testo (eccetto le parole di chiusa). L'indice integrale di MyISAM è in realtà inutile, perché non supporta la segmentazione delle parole cinesi e deve essere scritto nella tabella dati dall'utente dopo la segmentazione delle parole, e le parole con meno di 4 caratteri cinesi verranno ignorate come le parole di parada.
|