【问题标题】:How to decide number of mysql partitions如何确定mysql分区的数量
【发布时间】:2012-06-25 16:37:09
【问题描述】:

我有一个巨大的 mysql 表(用于记录)。比如:

记录器 (sha1) 时间戳 行动

因此预计会有大约 10 万个记录器。每个日志记录平均说 100 行。这将使表很快达到大约 1 亿行。

我需要快速完成插入(实际上是追加),因为很多记录器会同时写入条目。

一般查询将是“给我所有来自 logger 'x' 的日志,按日期排序”。

所以我打算使用mysql分区:http://dev.mysql.com/doc/refman/5.1/en/partitioning.html

我的问题是,如何在分区数和分区大小之间找到平衡?

由于记录器是一个 UUID 并且是一个 sha1 编号,我想让 mysql 只为每个 sha1 值创建一个分区,所以基本上每个记录器都有自己的数据库表文件。

任何其他建议表示赞赏

【问题讨论】:

  • 所以事实证明,最大分区数是 1024。现在我想我需要一些算法,将 sha1 值均匀地分成 1024 个不同的分区。或者关于为什么 1024 个分区不是一个好主意的建议。
  • 所以我正在考虑按哈希分区:dev.mysql.com/doc/refman/5.1/en/partitioning-hash.html - 但问题仍然存在,如何确定分区数。

标签: mysql database partitioning mysql-management database-performance


【解决方案1】:

将某物拆分为指定数字的一种简单方法是使用模数函数。

因此,也许如果您将 SHA1 哈希的前 4 个十六进制字符转换为整数(最高为 65,025)和 mod 1024,如下所示:

aa00 % 1024 = 512

十进制

43520 % 1024 = 512

所有返回 512 的数字都可以放在同一个分区中。计算将产生从 0 到 1023 的值。

【讨论】:

  • +1 因为我没有想到这一点,但对于我的 sha1 值来说不太合适,因为它不仅仅是一个很小的整数。我认为“哈希分区”应该让我正确,但是如何确定理想的分区数量..
  • @matiu,由于加密安全散列(例如 SHA1)是均匀分布的,因此无需将整个散列转换为整数进行计算。您可以按照我的建议简单地使用前几个字节。这应该会产生具有确定性(非随机)结果的良好分布。
猜你喜欢
  • 2021-01-09
  • 2018-11-02
  • 1970-01-01
  • 2022-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-29
相关资源
最近更新 更多