Cosa sono InnoDB e MyISAM in MySQL?


122

Cosa c'è InnoDBe MyISAMdentro MySQL?



È il motore del database ... kavoir.com/2009/09/…
Matthieu,

possiamo utilizzare entrambi i motori di archiviazione contemporaneamente per il nostro database?
user130561

1
Puoi utilizzarli contemporaneamente su diversi tavoli, ma per un dato tavolo dovrai scegliere quale vuoi usare ...
Matthieu,

Risposte:


111

InnoDBe MYISAMsono motori di archiviazione perMySQL .

Questi due differiscono nella loro implementazione del blocco: InnoDBblocca la riga specifica nella tabella e MyISAMblocca l'interaMySQL tabella.

È possibile specificare il tipo fornendo MYISAMOR InnoDBdurante la creazione di una tabella in DB.


Risposta chiara e semplice.
vadiraj jahagirdar

38

Dai un'occhiata a

InnoDB e MyISAM

InnoDB è un motore di archiviazione per MySQL, incluso come standard in tutti i binari correnti distribuiti da MySQL AB. Il suo principale miglioramento rispetto ad altri motori di archiviazione disponibili per l'uso con MySQL è il supporto delle transazioni conforme ad ACID

MyISAM è il motore di archiviazione predefinito per le versioni del sistema di gestione del database relazionale MySQL precedenti alla 5.5 1 . Si basa sul vecchio codice ISAM ma ha molte utili estensioni. La principale carenza di MyISAM è l'assenza di supporto alle transazioni. Le versioni di MySQL 5.5 e successive sono passate al motore InnoDB per garantire vincoli di integrità referenziale e maggiore concorrenza.


1
possiamo utilizzare entrambi i motori di archiviazione contemporaneamente per il nostro database?
user130561

2
puoi, perché per ogni tabella puoi definire un diverso motore di archiviazione. un'altra domanda è se dovresti. nella documentazione di mysql ci sono alcune spiegazioni su questo argomento.
nano7

18

Sono motori di archiviazione.

http://dev.mysql.com/doc/refman/5.1/en/storage-engines.html

MyISAM: il motore di archiviazione MySQL predefinito e quello più utilizzato nel Web, nel data warehousing e in altri ambienti applicativi. MyISAM è supportato in tutte le configurazioni MySQL ed è il motore di archiviazione predefinito a meno che non abbiate configurato MySQL per usarne uno diverso per impostazione predefinita.

InnoDB: un motore di archiviazione sicuro per le transazioni (conforme ad ACID) per MySQL che dispone di funzionalità di commit, rollback e ripristino da arresto anomalo del sistema per proteggere i dati dell'utente. Il blocco a livello di riga InnoDB (senza escalation a blocchi di granularità più grossolana) e le letture non di blocco coerenti in stile Oracle aumentano la concorrenza e le prestazioni multiutente. InnoDB memorizza i dati degli utenti in indici cluster per ridurre l'I / O per query comuni basate su chiavi primarie. Per mantenere l'integrità dei dati, InnoDB supporta anche i vincoli di integrità referenziale di FOREIGN KEY.


Quindi, mentre installiamo MySQL, dobbiamo specificare in modo specifico quale motore di archiviazione utilizzare come database MySQL?
user130561

3
Come accennato nel mio post, l'impostazione predefinita è MyISAM. Se si desidera utilizzare le funzionalità di un diverso motore di archiviazione come INNODB, è necessario specificare sì. Questa operazione non viene eseguita durante l'installazione, ma durante la creazione iniziale della tabella.
mluebke

3
Ma in base a questo: - dev.mysql.com/doc/refman/5.7/en/storage-engines.html ; Il motore predefinito è InnoDB.
Harsha

2
Secondo dev.mysql.com/doc/refman/5.5/en/storage-engine-setting.html : "Il motore predefinito è InnoDB a partire da MySQL 5.5.5 (MyISAM prima della 5.5.5)" Quindi il motore predefinito è ora InnoDB. Questa risposta è stata pubblicata 16 giorni dopo il primo rilascio a disponibilità generale con InnoDB come motore predefinito;)
SOFe

6

Volevo aggiungere che avere la capacità di specificare uno specifico motore di archiviazione per tabella è uno dei punti di forza di MySQL (oltre a facilità d'uso e buone prestazioni senza modifiche). Per tutte le operazioni in cui sono necessarie transazioni, basta attenersi a InnoDB. Tuttavia, MyISAM può davvero velocizzare le cose quando le transazioni non sono necessarie in determinate situazioni e richiede meno spazio su disco e RAM rispetto a InnoDB.

Detto questo, InnoDB migliora continuamente:

Miglioramenti delle prestazioni e della scalabilità di InnoDB 1.1


4

MyISAM non segue ACID al contrario di InnoDB che segue le transazioni per mantenere l'integrità dei dati.

MyISAM supporta inserimenti simultanei: se una tabella non ha blocchi liberi nel mezzo del file di dati, è possibile INSERIRE nuove righe nello stesso momento in cui altri thread stanno leggendo dalla tabella. MySqlDoc

Ecco perché MyISAM è più veloce e occupa meno spazio. Ad esempio, MySQL MyISAM Storage Engine non supporta le transazioni. vincoli di MySQL MYISAM C'è un po 'chiamato concurrent-insert Per impostazione predefinita, la variabile è impostata su 1 e gli inserimenti simultanei sono gestiti come appena descritto. Se è impostato su 0, gli inserimenti simultanei sono disabilitati. Se è impostato su 2, sono consentiti inserimenti simultanei alla fine della tabella anche per le tabelle che hanno righe eliminate. È possibile eseguire un'istruzione INSERT per aggiungere righe alla fine della tabella con select contemporaneamente se non ci sono buchi / righe eliminate al centro della tabella (al momento dell'inserimento simultaneo).

Il livello di isolamento predefinito di mysql InnoDB è "Read Repeatable". Per MyISAM non è prevista alcuna transazione. InnoDB utilizza il blocco a livello di riga mentre MyISAM può utilizzare solo il blocco a livello di tabella, motivo per cui InnoDB ha la funzione di ripristino di emergenza migliore di MyISAM. È necessario acquisire manualmente il blocco a livello di tabella in MyISAM se si desidera evitare gli effetti della concorrenza.


3

InnoDB è un motore di archiviazione transazionale di MySQL mentre MyISAM è un motore di archiviazione non transazionale. In altre parole, InnoDB segue le proprietà ACID per mantenere l'integrità dei dati ma MyISAM non segue le proprietà ACID non riuscendo così a mantenere l'integrità dei dati.

In una tabella InnoDB (transazionale), le modifiche transazionali possono essere facilmente annullate se è necessario un rollback. Tuttavia, le modifiche apportate a una tabella MyISAM (non transazionale) non possono essere annullate quando è richiesto il rollback di una transazione.

Ad esempio, vuoi trasferire denaro dal tuo conto corrente al conto di risparmio. Questo viene fatto da una transazione che include 5 query.

1 START TRANSACTION;
2 SELECT balance FROM checking WHERE customer_id = 10233276;
3 UPDATE checking SET balance = balance - 200.00 WHERE customer_id = 10233276;
4 UPDATE savings SET balance = balance + 200.00 WHERE customer_id = 10233276;
5 COMMIT;

Supponiamo che il processo si arresti in modo anomalo al passaggio 4. Se una tabella InnoDB è stata utilizzata qui, un rollback annullerebbe le modifiche e vieni salvato dal rischio di perdere denaro. Letteralmente, la tabella non è a conoscenza di alcun arresto anomalo poiché le modifiche non verranno applicate alla tabella a meno che il passaggio 5 non venga eseguito correttamente.

Ma nel caso di una tabella MyISAM, non è possibile annullare le modifiche transazionali quando viene chiamato un rollback o se si verifica un arresto anomalo che porta al fallimento della transazione. Ciò significa che, se la transazione si è interrotta al passaggio 3, il denaro verrà detratto dal tuo conto corrente. Ma i soldi non sarebbero stati aggiunti al tuo conto di risparmio.

Cortesia di esempio: "MySQL ad alte prestazioni: ottimizzazione, backup e replica" - Libro di Arjen Lentz, Derek J. Balling, Jeremy Zawodny, Peter Zaitsev e Vadim Tkachenko


1

Quando il tuo server MySQL si blocca, i dati possono essere recuperati molto più facilmente da un insieme di tabelle MyISAM che da quel grande file di transazione InnoDB. Ogni tabella MyISAM ha un file separato, e se non sono state effettuate operazioni di scrittura su questa tabella durante il crash, non ne sarà influenzata. In caso di InnoDB, l'intero file di transazione dell'intero server MySQL deve essere reindicizzato o qualunque cosa faccia dopo un arresto anomalo. Questo può diventare piuttosto complicato.


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.