首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按散列进行MySQL分区:年份和季度

按散列进行MySQL分区:年份和季度
EN

Stack Overflow用户
提问于 2021-04-15 17:16:27
回答 1查看 36关注 0票数 0

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

我有一个包含以下列的MySQL表:

代码语言:javascript
复制
some_data1, some_data2, date

我希望使用较大的卷,因此希望根据年份和季度对该表进行分区,因此希望每个季度将数据插入到新分区中。

我有这样的分区标准:

代码语言:javascript
复制
 HASH(YEAR(date) * 100 + QUARTER(date))

据我所知,它应该计算为2021001到2021年第一季度,2021002到2021年第二季度,以此类推。当然,我希望它能做我想做的事情:根据这个标准将数据插入到分区中:年份和季度。

但它实际做的是忽略了年份。因此包含日期的数据

代码语言:javascript
复制
2021-01-01, 2010-02-03, 3000-03-02, etc. 

恰好转到一个且唯一的分区。

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

(我使用的是PhpMyadmin,以防万一)

我头上的So...Which部分和土豆最匹配?:)

EN

回答 1

Stack Overflow用户

发布于 2021-04-15 23:18:57

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

散列函数的结果应该是分区的id (或#) -要100%确定,看看数据会去哪里。

当你有10个分区,但是HASH返回大于10的值时,奇怪的事情就开始发生了:我会说,它会把数据写到某个地方。

当你简化的时候--它会变得更清晰。

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

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

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

我的新散列标准:

代码语言:javascript
复制
 HASH((YEAR(date) - 2021) * 4 + QUARTER(date))

并将预先创建的所有分区保留定义的年数。清理功能也实现了--但我的应用程序设计已经实现了。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67105638

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档