Quando viene creato un database, un fattore spesso trascurato ma critico per le prestazioni è il motore di archiviazione (in particolare con la crescita del database). In molti casi, la tentazione è semplicemente accettare l'impostazione predefinita e continuare a sviluppare il tuo progetto. Ciò può portare a impatti negativi imprevisti su prestazioni, backup e integrità dei dati più avanti nel ciclo di vita dell'applicazione, ad esempio quando il tuo team implementa analisi e dashboard MySQL.
Per evitare queste potenziali insidie, daremo un'occhiata più da vicino ad alcuni dei motori di archiviazione più utilizzati supportati da MySQL (a partire dalla versione 5.7).
Motori di archiviazione supportati
Quali sono le mie opzioni?
Per impostazione predefinita, MySQL 5.7 supporta dieci motori di archiviazione (InnoDB, MyISAM, Memory, CSV, Archive, Blackhole, NDB, Merge, Federated ed Example). Per vedere quali sono disponibili e supportati dal tuo server, usa questo comando:
mysql> MOSTRA MOTORI\G
Questo produrrà un elenco di motori di archiviazione e ti dirà quali sono disponibili, non disponibili o quali sono attualmente impostati sull'impostazione predefinita. La colonna "Supporto:" visualizzerà rispettivamente "SI", "NO" o "predefinito".
In alcune applicazioni può sorgere la necessità di disporre di motori di archiviazione diversi per tabelle diverse nello stesso database. Questo è un esempio del motivo per cui è necessario pianificare attentamente il modello di dati per la propria applicazione. Nella maggior parte dei casi, tuttavia, sarà necessario un solo motore di archiviazione.
Capacità del motore di archiviazione
In cosa sono bravi?
Diamo un'occhiata più da vicino ad alcuni dei motori di archiviazione più comunemente utilizzati. Questo ci darà un'idea di ciò per cui ogni motore è stato progettato e di come può essere utilizzato al meglio per raggiungere i nostri obiettivi aziendali.
InnoDB: L'opzione predefinita in MySQL 5.7, InnoDB è un robusto motore di archiviazione che offre:
- Completa conformità ACID
- Commit, rollback e ripristino da arresti anomali
- Blocco a livello di riga
- Limiti di integrità referenziale CHIAVE STRANIERA
- Aumenta la concorrenza multiutente (tramite letture non bloccanti)
Con la funzionalità di cui sopra che InnoDB offre, è ovvio perché è il motore predefinito in MySQL. È un motore che funziona bene e offre molti degli attributi richiesti di cui qualsiasi database avrebbe bisogno. Tuttavia, una discussione completa di tutte le sue capacità non rientra nell'ambito di questo articolo. Questo è il motore che molto probabilmente verrà utilizzato nella maggior parte delle applicazioni.
Il mioISAM: La funzionalità che distingue MyISAM è la sua capacità di:
- indici di ricerca full-text
- blocco a livello di tabella
- mancanza di supporto per le transazioni
Sebbene sia un motore di archiviazione veloce, è più adatto per l'uso in applicazioni di lettura e principalmente lettura come data warehousing e applicazioni Web che non richiedono il supporto delle transazioni o la conformità ACID.
NDB (o NDBCLUSTER):se un ambiente cluster è il luogo in cui funzionerà il database, NDB è il motore di archiviazione preferito. È meglio quando hai bisogno di:
- Informatica distribuita
- Elevata ridondanza
- Alta disponibilità
- I tempi di attività più alti possibili
Tieni presente che il supporto per NDB non è incluso nella distribuzione dei binari standard di MySQL Server 5.7. Dovrai aggiornare all'ultima versione binaria di MySQL Cluster. Tuttavia, se stai sviluppando in un ambiente cluster, probabilmente hai l'esperienza necessaria per gestire queste attività.
CSV: Un utile motore di archiviazione quando i dati devono essere condivisi con altre applicazioni che utilizzano dati formattati CSV. Le tabelle vengono archiviate come file di testo con valori separati da virgole. Sebbene ciò renda più semplice la condivisione dei dati con script e applicazioni, uno svantaggio è che i file CSV non sono indicizzati. Quindi, i dati dovrebbero essere archiviati in una tabella InnoDB fino alla fase di importazione/esportazione del processo.
Buco nero: Questo motore accetta ma non memorizza i dati. Simile a UNIX /dev/null, le query restituiscono sempre un set vuoto. Ciò può essere utile in un ambiente di database distribuito in cui non si desidera archiviare i dati in locale o durante le prestazioni o altre situazioni di test.
Archivio: Proprio come suggerisce il nome, questo motore è eccellente per dati storici raramente referenziati. Le tabelle non sono indicizzate e la compressione avviene al momento dell'inserimento. Le transazioni non sono supportate. Utilizza questo motore di archiviazione per archiviare e recuperare i dati passati.
Federato: Questo motore di archiviazione consente di creare un unico database logico locale collegando diversi server MySQL fisici diversi. Nessun dato viene memorizzato sul server locale e le query vengono eseguite automaticamente sul rispettivo server remoto. È perfetto per ambienti di data mart distribuiti e può migliorare notevolmente le prestazioni quando si utilizza MySQL per il reporting analitico.
Designazione di un motore di archiviazione
Come faccio a cambiare il motore di archiviazione utilizzato?
Il motore di archiviazione utilizzato viene stabilito al momento della creazione della tabella. Come affermato in precedenza, InnoDB è il motore di archiviazione predefinito in MySQL versioni 5.5 e successive. Se desideri utilizzarne uno diverso, è meglio farlo all'interno della tua istruzione CREATE TABLE. Ad esempio, supponiamo che tu abbia identificato una tabella che deve utilizzare il motore di archiviazione CSV. La tua istruzione CREATE TABLE eccessivamente semplificata potrebbe assomigliare a questa:
mysql> CREATE TABLE Shared_Data (
-> Data_ID INTEGER NOT NULL,
-> Nome VARCHAR(50) NOT NULL,
-> Descrizione VARCHAR(150)
-> ) ENGINE='CSV';
Dopo di che eseguiremmo un'istruzione INSERT come al solito:
mysql> INSERT INTO Shared_Data VALUES
-> (1,'dispositivo uno', 'l'ultima versione della migliore tecnologia'),
-> (2,'dispositivo due', 'il più veloce sul mercato');
In caso di successo, se ispezioni la directory del database, ora dovrebbe esserci un file "Shared_Data.CSV" che contiene i record che hai inserito nella tabella Shared_Data.
La stessa metodologia può essere utilizzata per uno qualsiasi dei tanti motori di archiviazione supportati da MySQL. Sebbene sia possibile modificare il motore di archiviazione dopo che una tabella è stata creata con un ALTER TABLE
dichiarazione, è buona norma pianificare di conseguenza e impostarlo all'inizio.
In chiusura
MySQL ha molte opzioni
Come puoi vedere, MySQL offre supporto per motori di archiviazione progettati per gestire attività molto diverse in molti ambienti diversi. Identificare quali motori utilizzare e quando utilizzarli può aiutarci a evitare complicazioni inutili e problemi di prestazioni man mano che le nostre applicazioni si ridimensionano.
Sia che tu abbia bisogno di un tempo di attività e di un'affidabilità del 99,999% sul tuo cluster di elaborazione distribuita o che tu abbia bisogno di supporto per transazioni conforme a ACID con vincoli FOREIGN KEY, MySQL ha un motore di archiviazione adatto alle tue esigenze.
Come sempre, una corretta pianificazione e identificazione degli obiettivi e dei requisiti del progetto è il modo migliore per identificare con precisione quali storage engine sono più adatti alla tua applicazione. Si spera che questo articolo serva come utile punto di partenza per aiutarti in questo senso.
Questo articolo è apparso originariamente qui. Ripubblicato con autorizzazione. Invia qui i tuoi reclami sul copyright.