我想我不明白这个主题是如何工作的。
我有一个包含以下列的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,以防万一)
我头上的So...Which部分和土豆最匹配?:)
发布于 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!无意义的分区。
我的新散列标准:
HASH((YEAR(date) - 2021) * 4 + QUARTER(date))并将预先创建的所有分区保留定义的年数。清理功能也实现了--但我的应用程序设计已经实现了。
PS:一整天都搞砸了,只是因为有些人--让我们礼貌地说:“家伙”--没有费心去记录或解释这种行为。至少谷歌和MySQL网站没有帮到我。
https://stackoverflow.com/questions/67105638
复制相似问题