2017-09-12 2 views
0

J'ai une grande table avec environ 2Mln enregistrements, et je veux le partitionner. J'ai la colonne id comme PRIMARY AUTO_INCREMENT int (et il doit être toujours UNIQUE). J'ai une colonne "theyear" int (4) et je veux partitionner BY RANGE de 2016 à 2050, parce que la plupart des requêtes utilisent une instruction WHERE ayant une année à la fois. En procédant au partitionnement, j'obtiens une erreur disant que la clé "theyear" doit être avec la PRIMARY KEY, donc j'ai édité la clé primaire en faisant une clé multicolonne PRIMARY (id, theyear).Partitionnement MySQL - Erreur par clé primaire et enregistrements uniques

C'est OK, mais mes colonnes « id » est pas UNIQUE plus, car il contrôle colonnes « theyear » aussi ... Donc, si j'insérer:

INSERT INTO table (id, theyear) VALUES (1, 2016); 
INSERT INTO table (id, theyear) VALUES (1, 2017); 

il dit pas d'erreur, parce que la vérification UNIQUE à la fois id et theyear.

Comment implémenter le partitionnement sans perdre UNIQUE sur la colonne "id"?

Merci.

+0

Avez-vous essayé d'ajouter une contrainte 'unique' distincte par rapport à l'année? – cwallenpoole

+0

Je me base sur la documentation: https://dev.mysql.com/doc/refman/5.7/fr/partitioning-range.html, mais il me semble que vous n'avez pas besoin de changer votre clé primaire pour une partition RANGE. Tous les exemples qu'ils utilisent n'ont pas de clé primaire. Est-ce que je manque quelque chose? Essayez-vous de partitionner par KEY() par erreur? –

+0

Pourquoi voulez-vous partitionner? À votre avis, quelle requête sera la plus rapide? Veuillez fournir cette requête et 'SHOW CREATE TABLE'. Je vais probablement faire valoir qu'un index approprié sera aussi rapide ou plus rapide que le partitionnement. Peut-être que l'indice commencerait avec YEAR. Astuce: http://mysql.rjweb.org/doc.php/partitionmaint –

Répondre

0

Étant donné que vos requêtes utiliseront theyear, le partitionnement par RANGE vous aidera avec des données volumineuses, avec le bon INDEX.

Ne pas utiliser KEY() partionnement, gardez votre clé primaire

INDEX IDX_theyear(theyear) 

et

PARTITION BY RANGE (theyear) ( 
PARTITION p0 VALUES LESS THAN (2017), 
PARTITION p1 VALUES LESS THAN (2018), 
PARTITION p2 VALUES LESS THAN (2019), 
PARTITION p3 VALUES LESS THAN (2020) 

par exemple. Vous pouvez ajouter plus de partitions plus tard, mais plus dur. Si vos données sont plus anciennes, commencez évidemment par l'année la plus ancienne

+0

Je reçois: "# 1503 - Une clé PRIMARY doit inclure toutes les colonnes dans le partitionnement de la table fonction "comme je l'ai dit dans la question ... –

+0

Cela vous dérange-t-il de coller votre code de création de table? –