mysql使用key分区时,分区个数为非质数时分布不均

使用KEY或LINEAR KEY时,所有奇数编号分区(p1, p3, p5, … , p2n-1)中居然没有一条数据,同时,任何一个偶数编号分区却有很多的数据,而且还不是很均匀。如下图所示:

1971139.png

MySQL key 分区原理

KEY分区的原理:通过MySQL内置hash算法对分片键计算hash值后再对分区数取模,详见:https://dev.mysql.com/doc/refman/5.7/en/partitioning-key.html

按键分区与按哈希分区类似,不同的是,哈希分区使用用户定义的表达式,用于键分区的哈希函数由MySQL服务器提供。NDB集群使用MD5()来实现此目的;

对于使用其他存储引擎的表,服务器使用自己的内部散列函数,该函数基于与PASSWORD()相同的算法。

使用 mysql key 分区 bug 作为关键字进行搜索,发现有不少内容描述此问题。比如这个 MySQL之KEY分区引发的血案。这个就是mysql 5.7的bug, 但官网却没有任何说明,

所以建议不要使用key分区 ,建议使用hash或范围分区

其他文章的结论如下:

根据password函数,分析并测出,key分区,只能指定分区数目为质数,才能保证每个分区都有数据。我测了下,从11个分区,到17个分区。 只有11,13,17 ,这3个分区的数据是基本平均分布的

如果设置40,64,128等偶数个分区数(PARTITIONS 64),会导致编号为奇数的分区(p1, p3, p5, p7, … p2n-1)完全插不进数据;

如果设置63,121(PARTITIONS 63)这种奇数但非质数个分区数,所有分区都会有数据,但是不均匀;

如果设置137,31这种质数个分区数(PARTITIONS 137),所有分区都会有数据,并且非常均匀;

解决方法:

key分区,只能指定分区数目为质数,才能保证每个分区都有数据。如 11,13,17 ,这 3个分区数的数据是基本平均分布的。

参考链接:

https://blog.csdn.net/penriver/article/details/115551259

https://heapdump.cn/article/1971208