In questo post del blog parleremo di una delle funzionalità più utilizzate di MySQL:le partizioni.
Cos'è il partizionamento?
In MySQL, il partizionamento è una tecnica di progettazione di database in cui un database divide i dati in più tabelle, ma tratta comunque i dati come una singola tabella dal livello SQL. In poche parole, quando si partiziona una tabella, la si divide in più sottotabelle:il partizionamento viene utilizzato perché migliora le prestazioni di determinate query consentendo loro di accedere solo a una parte dei dati, rendendole così più veloci. Le operazioni di I/O possono anche essere migliorate perché i dati e gli indici possono essere suddivisi su più volumi del disco.
Ci sono due tipi di partizionamento:orizzontale e verticale. Il partizionamento orizzontale comporta l'inserimento di righe diverse in tabelle diverse, il partizionamento verticale invece comporta la creazione di tabelle con meno colonne e l'utilizzo di tabelle aggiuntive per archiviare le colonne rimanenti.
Come funziona il partizionamento?
- Quando vengono utilizzate query SELECT, il livello di partizionamento apre e blocca le partizioni, Query Optimizer determina se è possibile eliminare una qualsiasi delle partizioni, quindi il livello di partizionamento inoltra le chiamate API del gestore al motore di archiviazione che gestisce le partizioni.
- Quando vengono utilizzate le query INSERT, il livello di partizionamento apre e blocca le partizioni, determina a quale partizione dovrebbe appartenere la riga, quindi inoltra la riga a quella partizione.
- Quando vengono utilizzate le query DELETE, il livello di partizionamento apre e blocca le partizioni, determina quale partizione contiene la riga, quindi elimina la riga da quella partizione.
- Quando vengono utilizzate le query UPDATE, il livello di partizionamento apre e blocca le partizioni, determina quale partizione contiene la riga, recupera la riga e la modifica, quindi determina quale partizione deve contenere la nuova riga, inoltra la riga alla nuova partizione con una richiesta di inserimento, quindi inoltra la richiesta di eliminazione alla partizione originale.
Quando dovresti usare il partizionamento?
In generale, il partizionamento è utile quando:
- Hai molti dati di cui devi eseguire query.
- Le tue tabelle sono troppo grandi per stare in memoria.
- Le tue tabelle contengono dati storici e i nuovi dati vengono aggiunti nella partizione più recente.
- Pensate di dover distribuire il contenuto di una tabella su diversi dispositivi di archiviazione.
- Pensate di dover ripristinare singole partizioni.
Se uno o più degli scenari descritti sopra descrivono la tua situazione, il partizionamento potrebbe essere d'aiuto. Prima di partizionare i tuoi dati, però, tieni presente che le partizioni MySQL hanno i loro limiti:
- Le espressioni di partizionamento non consentono l'uso di procedure memorizzate, funzioni memorizzate, funzioni definite dall'utente (UDF) o plug-in e con supporto limitato per le funzioni SQL. Inoltre, non puoi utilizzare variabili dichiarate o memorizzate.
- Le tabelle partizionate non possono contenere o essere referenziate da chiavi esterne.
- C'è un limite di 1.024 partizioni per tabella (a partire da MariaDB 10.0.4, le tabelle possono contenere un massimo di 8.192 partizioni).
- Una tabella può essere partizionata solo se il motore di archiviazione supporta il partizionamento.
- La cache delle query non è a conoscenza del partizionamento o dello sfoltimento della partizione.
- Tutte le partizioni devono utilizzare lo stesso motore di archiviazione.
- Gli indici FullTEXT non sono supportati
- Le tabelle temporanee non possono essere partizionate
Le opzioni sopra dovrebbero aiutarti a decidere se il partizionamento è un'opzione per te o meno.
Tipi di partizionamento
Se decidi di utilizzare le partizioni, tieni presente che hai un certo numero di tipi di partizionamento tra cui scegliere. Tratteremo brevemente le tue opzioni di seguito, quindi approfondiremo:
- Il partizionamento per RANGE può aiutarti a partizionare le righe in base ai valori delle colonne che rientrano in un determinato intervallo.
- Il partizionamento per LIST può aiutarti a partizionare le righe in base all'appartenenza dei valori di colonna in un determinato elenco.
- Il partizionamento per HASH può aiutarti a partizionare le righe in base a un valore restituito da un'espressione definita dall'utente.
- Il partizionamento per KEY può aiutarti a partizionare le righe in base a una funzione di hashing fornita da MySQL.
Partizionamento per RANGE
Il partizionamento per RANGE è una delle forme più popolari di partizionamento delle tabelle MySQL. Quando si partiziona una tabella per RANGE, si partiziona la tabella in modo tale che ogni partizione contenga un certo numero di righe che rientrano in un determinato intervallo. Per definire una partizione, definirne il nome, quindi indicarle quali valori deve contenere - per partizionare una tabella per intervallo, aggiungere un'istruzione PARTITION BY RANGE. Ad esempio, se si desidera assegnare un nome alla partizione p0 e far sì che contenga tutti i valori inferiori a 5, è necessario assicurarsi che la query contenga VALORI DI PARTIZIONE p0 MINORI DI (5). Ecco un esempio di tabella partizionata:
CREATE TABLE sample_table (
id INT(255) NOT NULL AUTO_INCREMENT PRIMARY KEY,
column_name VARCHAR(255) NOT NULL DEFAULT ‘’
...
) PARTITION BY RANGE (column_name) (
PARTITION p0 VALUES LESS THAN (5),
PARTITION p1 VALUES LESS THAN (10),
PARTITION p2 VALUES LESS THAN (15),
PARTITION p3 VALUES LESS THAN (20),
...
);
Puoi anche definire una partizione che contenga tutti i valori che non rientrano in determinati intervalli in questo modo:
PARTITION p5 VALUES LESS THAN MAXVALUE
La partizione sopra è denominata p5 e contiene tutti i valori che le altre partizioni non hanno - MAXVALUE rappresenta un valore che è sempre superiore al valore più grande possibile. Puoi anche usare le funzioni definendo le tue partizioni in questo modo:
PARTITION BY RANGE (YEAR(date)) (
PARTITION p0 VALUES LESS THAN (2000),
PARTITION p1 VALUES LESS THAN (2010),
PARTITION p2 VALUES LESS THAN (2020),
PARTITION p3 VALUES LESS THAN MAXVALUE
);
In questo caso, tutti i valori inferiori a 2000 vengono archiviati nella partizione p0, tutti i valori inferiori a 2010 vengono archiviati nella partizione p1, tutti i valori inferiori a 2020 vengono archiviati in la partizione p2 e tutti i valori che non rientrano in nessuno di questi intervalli vengono archiviati nella partizione p3.
Partizionamento per LIST
Il partizionamento delle tabelle MySQL per LIST è simile al partizionamento per RANGE - la differenza principale del partizionamento delle tabelle per LIST è che quando le tabelle sono partizionate per LIST ogni partizione è definita e selezionata in base all'appartenenza a un valore di colonna in un insieme di liste valori anziché in un intervallo di valori. Il partizionamento per LIST può essere utile quando sai che, ad esempio, hai dati che possono essere divisi in più insiemi di dati più piccoli (ad esempio, regioni). Supponiamo di avere un negozio con 4 franchising:uno nella parte centrale della città, il secondo a nord, il terzo a est, il quarto a ovest. Puoi partizionare una tabella in modo tale che i dati appartenenti a un determinato franchising vengano archiviati in una partizione dedicata a quel franchising:
PARTITION BY LIST(store) (
PARTITION central VALUES IN (1,3,5),
PARTITION north VALUES IN (2,4,7),
PARTITION east VALUES IN (8,9),
PARTITION west VALUES IN (10,11)
);
Partizionamento per HASH
Il partizionamento delle tabelle MySQL tramite HASH può essere un modo per assicurarsi che i dati tra le partizioni siano distribuiti uniformemente. Se stai partizionando le tue tabelle per HASH, devi solo specificare in quante partizioni devi dividere i tuoi dati - il resto è gestito da MySQL. È possibile utilizzare il partizionamento tramite HASH aggiungendo la seguente istruzione a CREATE TABLE:
PARTITION BY HASH(id)
PARTITIONS 5;
Sostituisci 5 con il numero che specifica in quante partizioni devi dividere i tuoi dati:il numero predefinito è 1.
MySQL supporta anche il partizionamento tramite LINEAR HASH - l'hashing lineare è diverso dall'hashing normale perché l'hashing lineare utilizza un algoritmo a poteri di due lineari. Per partizionare le tabelle in base a un HASH LINEARE, sostituisci PARTITION BY HASH con PARTITION BY LINEAR HASH.
Partizionamento per CHIAVE
Il partizionamento delle tabelle MySQL tramite KEY è simile al partizionamento delle tabelle MySQL tramite HASH:in questo caso, la funzione di hashing per il partizionamento delle chiavi è fornita dal server MySQL. Qualsiasi colonna utilizzata come chiave di partizionamento deve comprendere la chiave primaria dell'intera tabella o almeno far parte della chiave primaria della tabella. Se non viene specificato alcun nome di colonna come chiave di partizionamento, verrà utilizzata la chiave primaria. Se non esiste una chiave primaria, ma esiste una chiave univoca, verrà utilizzata invece la chiave univoca. Ad esempio, le seguenti istruzioni sono entrambe valide, anche se la prima istruzione non specifica nemmeno la chiave di partizionamento:
CREATE TABLE demo_table (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL DEFAULT ''
)
PARTITION BY KEY()
PARTITIONS 2;
CREATE TABLE demo_table (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
)
PARTITION BY KEY(id)
PARTITIONS 5;
Conclusione
Per riassumere, le partizioni possono essere utili se hai molti dati, le tue tabelle sono troppo grandi per stare in memoria o contengono dati storici. Le partizioni possono essere utili anche se ritieni di dover distribuire il contenuto di una tabella su diversi supporti di archiviazione, anche se desideri avere la possibilità di eliminare o ripristinare singole partizioni.
Tuttavia, tieni presente che le partizioni in MySQL hanno i loro svantaggi. Uno dei principali svantaggi del partizionamento è che renderà le tue tabelle più grandi:non puoi guadagnare velocità senza compromettere lo spazio. Se disponi di un insieme di dati molto ampio, questo può essere un grosso problema.