myschar分区通过varchar - 随机行为?

时间:2016-01-03 10:53:29

标签: mysql database-partitioning

我正在尝试熟悉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';   

结果:

partition_name,table_rows

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

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

但是,如果我将性别定义为nvarchar(6)或varchar(40),则行的分布方式与我在两个分区中的预期相同

partition_name,table_rows

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

如果我将性别提升到varchar(60),则所有记录都会进入单个分区。 如果我将它更多地提高到varchar(100),则记录在两个分区之间均匀分布。

这背后有什么逻辑,还是我做错了什么?

1 个答案:

答案 0 :(得分:0)

doc says

  

按键分区类似于散列分区,除了   散列分区采用用户定义的表达式散列   密钥分区的功能由MySQL服务器提供。这个   内部散列函数基于与之相同的算法   PASSWORD()。

MySQL通过一个任意的运行你的两个值(MaleFemale),并向你实现不可预测的哈希函数。在某些情况下,散列函数会为这两个值产生相同的输出,并且在某些其他情况下,它会产生不同的值。因此,有时您的所有行都会在特定分区中结束,有时它们最终会分成两个分区。

像您选择的那个列,具有较少数量的不同值的列,不是(明显的人),是散列或键分区的绝佳选择。 Range partitioning可能更适合。