2016-01-03 4 views
2

J'essaie de me familiariser avec MySQL Cluster Community Server (version: 5.6.27-ndb-7.4.8-cluster-gpl) et j'ai la première question qui me laisse perplexe. J'ai cherché dans la documentation et le forum mais je n'ai pas trouvé quelque chose de pertinent.mysql partition par varchar - comportement aléatoire?

J'ai une table très simple sur un cluster avec 4 noeuds/partitions données:

CREATE TABLE customer ( 
    id int(10) NOT NULL , 
    surname varchar(35) NOT NULL, 
    gender varchar(6) NOT null, 
    primary key(id, surname, gender) 
)ENGINE=NDBCLUSTER DEFAULT CHARSET=latin1 PARTITION by key (gender); 

-je choisir donc d'avoir une partition par clé sur le genre (il prend les valeurs mâle/femelle). Insérer 1000 lignes et je veux voir comment ils sont distribués:

SELECT partition_name, table_rows 
FROM information_schema.PARTITIONS 
WHERE table_name='customer'; 

Résultats:

nom_partition, table_rows

'p0', '0'
'p1', '1000'
'p2', '0'
'p3', '0'

donc toutes les lignes vont dans une seule partition.

Toutefois, si je définis le genre comme nvarchar (6) ou varchar (40) les lignes sont distribuées comme j'attendre dans deux partitions

nom_partition, table_rows

'p0', '493'
'p1', '0'
'p2', '507'
'p3', '0'

Si je relance le genre à varchar (60), tous les enregistrements vont dans une seule partition. Si je l'augmente encore plus à varchar (100), les enregistrements sont répartis équitablement entre deux partitions.

Y a-t-il une logique derrière cela ou est-ce que je fais quelque chose de complètement faux?

Répondre

0

Le doc says,

Partitioning par clé est similaire à partitionnement par hachage, sauf que où le partitionnement de hachage utilise une expression définie par l'utilisateur, la fonction hachage pour le partitionnement clé est fournie par le serveur MySQL. Cette fonction de hachage interne est basée sur le même algorithme que PASSWORD().

MySQL est en cours d'exécution de vos deux valeurs (Male et Female) pour cette colonne par un arbitraire, et vous l'imprévisible implémenteur, la fonction de hachage. Dans certaines circonstances, cette fonction de hachage produit le même résultat pour ces deux valeurs et, dans d'autres circonstances, elle donne des valeurs différentes. Ainsi, parfois toutes vos lignes se retrouvent dans une partition particulière, et parfois elles se retrouvent dans deux partitions.

Une colonne comme celle que vous avez choisie, avec un faible nombre de valeurs distinctes, n'est pas un choix idéal pour le hachage ou la partition de clés. Range partitioning pourrait être plus approprié.

+0

Il semble que oui.D'autre part, il est un peu étrange que la fonction de hachage retourne la même sortie, je m'attendrais à ce qu'une collision de hachage soit extrêmement rare et ne dépende pas de la longueur de varchar. J'ai essayé avec le partitionnement de gamme, mais ne fonctionne pas avec varchar. J'ai également essayé d'obtenir le code ASCII du premier caractère à utiliser dans la gamme comme ceci: Range (ASCII (LEFT (sexe, 1)) mais j'obtiens une erreur – user5740173

+0

La probabilité que deux nombres aléatoires choisis parmi [1,4] sera égal à l'autre est 0.25 Quand tout ce que vous avez sont quatre seaux de hash, la probabilité de collision n'est pas petite du tout. –