Come modificare una partizione MySQL
In un articolo precedente ci siamo occupati di come partizionare una tabella MySQL, e quali benifici possiamo ottenere da questo partizionamento.
Oggi vediamo come manipolare una partizione, cioè come modificarla, eliminarla o svuotarla dai suoi records, utilizzando il comando ALTER TABLE.
Modifica di una partizione RANGE o LIST
In una tabella partizionata by RANGE o LIST è possibile cancellare o svuotare una partizione, con tutti i records in esso contenuti.
Ripartiamo dall'esempio visto nell'articolo precedente, e cioè da questa tabella partizionata per RANGE
CREATE TABLE IF NOT EXISTS `stat` (
`stat_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`stat_data` datetime DEFAULT NULL,
`stat_ip` varchar(22) DEFAULT NULL,
PRIMARY KEY (`stat_id`,`stat_data`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
PARTITION BY RANGE(YEAR(stat_data)) (
PARTITION p0 VALUES LESS THAN (2014) ENGINE = MyISAM,
PARTITION p1 VALUES LESS THAN (2015) ENGINE = MyISAM,
PARTITION p2 VALUES LESS THAN (2016) ENGINE = MyISAM,
PARTITION p3 VALUES LESS THAN (2017) ENGINE = MyISAM,
PARTITION p4 VALUES LESS THAN MAXVALUE ENGINE = MyISAM
)
;
Se, ad esempio, non ci interessano più i dati salvati nella nostra tabella nell'anno 2014, possiamo svuotare la partizione p0 utilizzando TRUNCATE, in questo modo
ALTER TABLE stat TRUNCATE PARTITION p0;
Andiamo adesso a verificare le partizioni e i records contentuti
SELECT PARTITION_NAME, TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME='stat';
+----------------+------------+
| PARTITION_NAME | TABLE_ROWS |
+----------------+------------+
| p0 | 0 |
| p1 | 145653 |
| p2 | 1896542 |
| p3 | 23464 |
+----------------+------------+
Come possiamo vedere la partizione p0 non contiene più records.
Questo risultato è il medesimo che avrei ottenuto utilizzando il consueto comando DELETE
DELETE FROM stat WHERE YEAR(stat_data) < 2015;
Utilizzando TRUNCATE sulla specifica partizione, otterremo una processo di cancellazione nettamente più veloce rispetto all'utilizzo di DELETE.
Se invece la partizione p0 non ci interessa più, e quindi vogliamo eliminarla, utilizziamo DROP
ALTER TABLE stat DROP PARTITION p0;
Verifichiamo adesso le nostre partizioni:
SELECT PARTITION_NAME, TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME='stat';
+----------------+------------+
| PARTITION_NAME | TABLE_ROWS |
+----------------+------------+
| p1 | 145653 |
| p2 | 1896542 |
| p3 | 23464 |
+----------------+------------+
Come possiamo vedere la partizione p0 non è più presente.
Possiamo anche aggiungere una nuova partizione, utilizzando il comando ALTER TABLE .... ADD PARTITION, ma è possibile farlo SOLO dopo l'ultima partizione creata, nel nostro esempio quindi dopo la partizione p3, in questo modo:
ALTER TABLE stat ADD PARTITION (PARTITION p4 VALUES LESS THAN (2019));
Andiamo a verificare le partizioni adesso esistenti:
SELECT PARTITION_NAME, TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME='stat';
+----------------+------------+
| PARTITION_NAME | TABLE_ROWS |
+----------------+------------+
| p1 | 145653 |
| p2 | 1896542 |
| p3 | 23464 |
| p4 | 0 |
+----------------+------------+
Non è quindi possibile inserire una partizione tra le partizioni già esistenti, oppure prima della prima partizione (nel nostro esempio p1).
Ad esempio provate questo ALTER TABLE
ALTER TABLE stat ADD PARTITION (PARTITION p0 VALUES LESS THAN (2015));
MySQL restituirà un errore "VALUES LESS THAN value must be strictly increasing for each partition".
Modifica di una partizione KEY o HASH
Vediamo adesso quali operazioni possiamo effettuare in una tabella partizionata per HASH o KEY.
Consideriamo una tabella partizionata, ad esempio, per HASH, con 12 partizioni
CREATE TABLE clienti (
clienti_id INT,
clienti_cognome VARCHAR(30),
clienti_nome VARCHAR(30),
clienti_data DATE
)
PARTITION BY HASH( MONTH(clienti_data) )
PARTITIONS 12;
Possiamo modificare il numero di partizioni, ad esempio, riducendole a 5, utilizzando il comando ALTER TABLE .... COALESCE PARTITION in questo modo:
ALTER TABLE clienti COALESCE PARTITION 5;
Se invece vogliamo aumentare il numero di partizioni , ad esempio a 6, utilizziamo un ALTER TABLE .... ADD PARTITION in questo modo:
ALTER TABLE clienti ADD PARTITION PARTITIONS 6;