2012-01-13 4 views
3

Je souhaite utiliser les tables de partitions mysql pour partitionner une table en YEAR et le numéro WEEK. Je sais exactement comment faire cela avec les tables de fusion mysql mais les tables de partition sont différentes. Quelqu'un peut-il s'il vous plaît aider avec le schéma de table suivant?Partitionnement MySQL par année et par semaine

CREATE TABLE `tableName` (
    `id` int(10) NOT NULL AUTO_INCREMENT, 
    `dateandtime` datetime NOT NULL, 
    `othervalue` int(10) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM; 

Aussi doit-il être dans un certain moteur?

Et si je stocke le dateandtime comme un horodatage int (10), comment le ferais-je?

CREATE TABLE `tableName` (
    `id` int(10) NOT NULL AUTO_INCREMENT, 
    `dateandtime` int(10) NOT NULL, 
    `othervalue` int(10) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM; 

Répondre

2

MySQL 5.1 ne peut pas faire la partition par date, vous devez donc vous contourner ... Habituellement, vous divisez par fonction TO_DAYS(dateandtime), par exemple comme ceci:

 
CREATE TABLE tbl (
...) ENGINE=InnoDB 
PARTITION BY RANGE (to_days(dateandtime)) (
PARTITION pNULL VALUES LESS THAN (0) ENGINE = InnoDB, 
PARTITION p20111218 VALUES LESS THAN (TO_DAYS('2011-12-18')) ENGINE = InnoDB, 
PARTITION p20111225 VALUES LESS THAN (TO_DAYS('2011-12-25')) ENGINE = InnoDB, 
PARTITION pNew VALUES LESS THAN MAXVALUE ENGINE = InnoDB 
) 

I définis ici 4 partitions - le premier est juste pour le bien de l'exhaustivité, de sorte que l'insertion de date à l'avenir ne manquera pas. (Vous ne pouvez pas INSERT une valeur pour laquelle une partition n'existe pas.) La première partition est pour la performance - les valeurs NULL seront stockées ici de manière temporaire. Les deux partitions du milieu sont actuellement utilisées, chacune conservant une semaine de données.

Vous pouvez supprimer l'ancienne partition (c'est très rapide par rapport à DELETEing anciennes lignes) en utilisant ALTER TABLE tbl DROP PARTITION xyz. Vous pouvez ajouter de nouvelles partitions en divisant la dernière partition:

 
ALTER TABLE tbl REORGANIZE PARTITION pNew INTO (
    PARTITION p20120115 VALUES LESS THAN (TO_DAYS('2012-01-16')), 
    ... 
    PARTITION pNew VALUES LESS THAN (MAXVALUE) 
); 
+0

dateandtime doit faire partie de la clé PRIMARY ou UNIQUE, n'est-ce pas? – Bretticus

+0

non ... J'utilise pour la journalisation des tables qui ont plus de 12 millions de lignes par jour, donc aussi beaucoup de lignes dans la même seconde, donc UNIQUE ne serait pas possible dans mon cas. – Marki555