-
Non è necessario che il partizionamento sia basato esclusivamente su una chiave univoca. Tuttavia, se è presente una chiave univoca, dovrebbe essere inclusa nelle colonne utilizzate per partizionare la tabella. Per partizionare la tabella sulla colonna UNIXTIME, eseguire:
ALTER TABLE MyTable PARTITION BY RANGE COLUMNS (UNIX_TIMESTAMP(datetime_column)) ( PARTITION p01 VALUES LESS THAN (2), PARTITION p02 VALUES LESS THAN (3), PARTITION p03 VALUES LESS THAN (4), PARTITION p04 VALUES LESS THAN (MAXVALUE));
Oppure puoi partizionare immediatamente sulla colonna datetime in MySQL 5.5+ :
ALTER TABLE MyTable PARTITION BY RANGE COLUMNS (datetime_column) ( PARTITION p01 VALUES LESS THAN ('2013-01-01'), PARTITION p02 VALUES LESS THAN ('2013-02-01'), PARTITION p03 VALUES LESS THAN ('2013-03-01'), PARTITION p04 VALUES LESS THAN (MAXVALUE));
-
Versione completamente automatizzata (conserverebbe ogni mese nella propria partizione, 5 mesi di dati conservati):
ALTER TABLE MyTable PARTITION BY RANGE COLUMNS (YEAR(datetime_column)*100 + MONTH(datetime_column)) ( PARTITION p201301 VALUES LESS THAN (201301), PARTITION p201302 VALUES LESS THAN (201302), PARTITION p201303 VALUES LESS THAN (201303), PARTITION p201304 VALUES LESS THAN (201304), PARTITION p201305 VALUES LESS THAN (201305), PARTITION p_MAXVALUE VALUES LESS THAN (MAXVALUE)); DECLARE @Min_Part int DECLARE @Last_Part int DECLARE @SQL varchar (1000) If (select count (distinct MONTH(datetime_column)) from MyTable) > 5 THEN BEGIN select @Min_Part = (select min(year(datetime_column)*100 + month(datetime_column)) from MyTable), @Last_Part = (select max(year(datetime_column)*100 + month(datetime_column)) from MyTable) set @SQL = 'Alter table MyTable REORGANIZE PARTITION p_MAXVALUE (into partition p' +TO_CHAR (@Last_Part) + 'values less than (' + TO_CHAR (@Last_Part) + ')' call common_schema.eval (@sql) set @SQL = 'Alter table MyTable DROP PARTITION p' + TO_CHAR (@Min_Part) call common_schema.eval (@sql) END
PS Ci scusiamo se SQL non è esattamente corretto - non è possibile analizzarlo in questo momento.