首页 > 解决方案 > MySQL 按哈希分区:年和季度

问题描述

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

我有一个包含这些列的 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,以防万一)

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

标签: mysqldatabase-partitioning

解决方案


好吧,我想我已经弄清楚了那个奇怪的逻辑。

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 网站并没有帮助我。


推荐阅读