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

如何解决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,以防万一)

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

解决方法

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?