通过varchar进行mysql分区-随机行为?
我正在尝试熟悉MySQL Cluster Community Server(版本:5.6.27-ndb-7.4.8-Cluster-gpl),第一个问题让我感到困惑。我搜索了文档和论坛,但没有找到相关内容 我在一个包含4个数据节点/分区的集群上有一个非常简单的表:通过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
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。当您只有四个哈希桶时,冲突概率一点也不小。