MySQL 按哈希分区:年份和季度

时间:2021-04-15 09:16:27

标签: mysql database-partitioning

我想我不明白这个主题是如何运作的。

我有一个包含此类列的 MySQL 表:

some_data1, some_data2, date

我期望大容量,所以我希望这个表根据年份和季度进行分区,所以我希望每个季度将数据插入一个新分区。

我有这样的划分标准:

 HASH(YEAR(date) * 100 + QUARTER(date))

根据我的理解,应该计算为 2021001 到 2021 年第一季度、2021002 到 2021 年第二季度,依此类推。当然,我希望它做我想做的事:根据以下条件将数据插入分区:年份和季度。

但它实际上做了什么 - 它忽略了年份。所以带日期的数据

2021-01-01, 2010-02-03, 3000-03-02, etc. 

完全转到一个且唯一的分区。

这个问题的另一部分是 - 我猜 MySQL 不会为每个新计算的哈希标准自动创建新分区,对吗?如果我从这样的表中清除一些旧数据,将某些特定分区留空怎么办。具有新计算散列的新数据会转到这个空分区,还是我应该像往常一样做脏活并再次手动创建分区?这将留下一大堆空分区...

(我正在使用 PhpMyadmin,以防万一)

那么……我头的哪个部位最适合土豆? :)

1 个答案:

答案 0 :(得分:0)

好吧,我想我已经找到了那个奇怪的逻辑。

HASH 函数的结果应该是分区的 id(或 #) - 100% 确定并查看数据的去向。

当您假设有 10 个分区时,奇怪的事情开始发生,但 HASH 返回的值大于 10:它会将数据写入某个地方。

当你简化 - 它变得更清晰。

在上面的示例中,我有 5 个分区。我的 2021 年和 3000 年测试数据的 HASH 结果类似于 202102、202104、300001、30002 等。作为一个聪明人,我希望 MySQL 为每个唯一的 HASH 结果自动创建新分区并填充它。啊哈。继续期待。

我意识到为了简单起见(或为了测试它的好),HASH 函数应该只返回从今年开始的季度号。因此,2021 年将有 1 到 4 个季度数字,明年的季度数字为 5 到 8 个,后年为 9 到 12 个,依此类推。

而且 - 当然 - 我必须提前创建所有分区!否则 MySQL 将开始过度填充现有分区。我希望一个分区的记录少于 1m,但如果我只创建了 3 年的分区(就我而言),在第 4 年我的分区将超过 1m!毫无意义的分区。

我的新 HASH 标准:

 HASH((YEAR(date) - 2021) * 4 + QUARTER(date))

以及提前创建的所有分区,保留定义的年数。清理功能也实现了 - 但这已经是我的应用设计了。

PS:一整天都搞砸了,只是因为有些人——让我们礼貌地说:“家伙”——没有费心记录或解释这种行为。至少 google 和 MySQL 站点没有帮助我。