通过varchar进行mysql分区-随机行为?

通过varchar进行mysql分区-随机行为?,mysql,database-partitioning,Mysql,Database Partitioning,我正在尝试熟悉MySQL Cluster Community Server(版本:5.6.27-ndb-7.4.8-Cluster-gpl),第一个问题让我感到困惑。我搜索了文档和论坛,但没有找到相关内容 我在一个包含4个数据节点/分区的集群上有一个非常简单的表: CREATE TABLE customer ( id int(10) NOT NULL , surname varchar(35) NOT NULL, gender varchar(6) NOT null

我正在尝试熟悉MySQL Cluster Community Server(版本:5.6.27-ndb-7.4.8-Cluster-gpl),第一个问题让我感到困惑。我搜索了文档和论坛,但没有找到相关内容

我在一个包含4个数据节点/分区的集群上有一个非常简单的表:

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);   
因此,我选择按键划分性别(它采用男性/女性值)。我插入了1000行,我想看看它们是如何分布的:

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

分区\名称,表\行 “p0”,“0”
‘p1’、‘1000’
“p2”,“0”
'p3','0'

所以所有的行都进入一个分区

但是,如果我将gender定义为nvarchar(6)或varchar(40),那么这些行将像我期望的那样分布在两个分区中

分区\名称,表\行 ‘p0’、‘493’
“p1”,“0”
‘p2’、‘507’
'p3','0'

如果我将gender提高到varchar(60),那么所有记录都将进入一个分区。 如果我将其提高到varchar(100),记录将均匀分布在两个分区之间

这背后有什么逻辑吗?还是我做了一些完全错误的事情

按键分区与按哈希分区类似,只是 在散列分区使用用户定义的表达式的情况下,散列 用于密钥分区的函数由MySQL服务器提供。这 内部哈希函数基于与相同的算法 密码()

MySQL通过一个任意的、对您来说是实现者不可预测的散列函数,为该列运行您的两个值(
Male
Female
)。在某些情况下,哈希函数为这两个值生成相同的输出,而在其他一些情况下,它生成不同的值。所以,有时所有的行都在一个特定的分区中结束,有时它们在两个分区中结束


像您选择的列一样,具有少量不同值的列(显而易见的人说)不是散列或键分区的最佳选择。可能更合适。

似乎是这样。另一方面,hash函数返回相同的输出有点奇怪,我认为hash冲突非常罕见,并且不取决于varchar的长度。我尝试使用范围分区,但不使用varchar。我还试图得到第一个字符的ASCII码,以便在如下范围内使用:Range(ASCII(左(性别,1)),但我得到一个错误从[1,4]中选择的两个随机数彼此相等的概率是0.25。当您只有四个哈希桶时,冲突概率一点也不小。