我正在尝试熟悉MySQL群集社区服务器(版本: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'
所以所有行都进入一个分区。
但是,如果我将性别定义为nvarchar(6)或varchar(40),则行的分布方式与我在两个分区中的预期相同
'p0','493'
'p1','0'
'p2','507'
'p3','0'
如果我将性别提升到varchar(60),则所有记录都会进入单个分区。 如果我将它更多地提高到varchar(100),则记录在两个分区之间均匀分布。
这背后有什么逻辑,还是我做错了什么?
答案 0 :(得分:0)
按键分区类似于散列分区,除了 散列分区采用用户定义的表达式散列 密钥分区的功能由MySQL服务器提供。这个 内部散列函数基于与之相同的算法 PASSWORD()。
MySQL通过一个任意的运行你的两个值(Male
和Female
),并向你实现不可预测的哈希函数。在某些情况下,散列函数会为这两个值产生相同的输出,并且在某些其他情况下,它会产生不同的值。因此,有时您的所有行都会在特定分区中结束,有时它们最终会分成两个分区。
像您选择的那个列,具有较少数量的不同值的列,不是(明显的人),是散列或键分区的绝佳选择。 Range partitioning可能更适合。