2009-12-03 13 views
0

J'ai une table qui ressemble essentiellement comme ceci:Comment puis-je utiliser le partitionnement de table MySQL sur cette table?

CREATE TABLE myTable (
    id INT auto_increment, 
    field1 TINYINT, 
    field2 CHAR(2), 
    field3 INT, 
    theDate DATE, 
    otherStuff VARCHAR(20) 
    PRIMARY KEY (id) 
    UNIQUE KEY (field1, field2, field3) 
) 

J'aimerais partitionner la table en fonction du mois et l'année de theDate, mais the manual me dit que je ne suis pas autorisé:

Toutes les colonnes utilisées dans l'expression de partitionnement d'une table partitionnée doivent faire partie de chaque clé unique que la table peut avoir. En d'autres termes, chaque clé unique de la table doit utiliser chaque colonne de l'expression de partitionnement de la table

Quelles sont mes options ici? Puis-je encore partitionner la table?

Répondre

3

J'ai écrit un article sur ce problème ici Scaling Rails with MySQL table partitioning (rails utilise des PK entiers). La même technique devrait fonctionner dans votre cas, sauf que, malheureusement, vous devez supprimer la clé unique [field1, field2, field3]. La suppression d'une clé unique a également été un problème que j'ai traité (mais pas mentionné dans la publication). J'ai travaillé autour d'elle en mettant en place un contrôle d'existence avant de créer le disque, réalisant que nous aurions toujours des dupes occasionnelles en raison de la condition de concurrence. En pratique, cela ne s'est pas avéré être un problème. Cependant, le débit de requêtes accru a nécessité une augmentation de la taille du tampon innodb, car les E/S sont brutales.

+0

Merci pour ces idées. – nickf

0

Non, pas dans la forme actuelle.

Vous pouvez supprimer la clé primaire et simplement faire de "id" un index normal. L'index unique secondaire reste un problème et vous devez le supprimer ou modifier le schéma de partitionnement pour impliquer la colonne Date.

+0

quel énorme PITA. :-( – nickf

0

Si vous partitionnez en fonction de l'année et du mois d'une colonne datetime, avez-vous pensé à avoir une table pour chaque combinaison année-mois, puis en utilisant un merge table? Je sais que cela ne répond pas directement à votre question, mais je pense que cela peut aider ...

+0

Salut Lytol, je l'avais pensé, mais j'avais entendu dire qu'ils étaient en fait plus lents que d'avoir une seule grande table, avez-vous des idées? – nickf