我的 SQL 分区建议
MY SQL Partitioning advice
我们目前正在决定 MySQL 数据库中 table 的分区方案。我们有多个分片,我们将所有单个用户记录路由到一个分片。我们还想通过 userid 对 table 本身进行分区。我们对分区有些陌生,希望得到一些关于使用哪种类型的分区以及我们可能需要多久维护一次分区的反馈。
我们使用键分区、线性键、散列和线性散列进行了一些简单的测试。在我们的测试中,散列似乎是最快的插入选项,而且它似乎还使用随机生成的用户 ID 为我们提供了最佳分布。然而,在阅读文档时,我们了解到如果您想合并或优化分区,线性哈希会更好,但我们注意到它在插入时要慢得多。我们真的不明白为什么我们需要合并或优化分区,所以我们不确定这应该引起多大的考虑。
此外……我们计划使用最大分区数(我认为是 1000 个),因为我们看不到这种方法有任何负面影响,它应该通过将每个分区的记录数限制为最大程度。在决定分区数量时有什么我们应该考虑的,还是可以简单地使用 1000 个分区?
有人对此有什么建议吗?
所以对于任何可能对此主题感兴趣的人,这是我的经验:
我们最终决定不使用 MYSQL 分区,而是使用数据库分片。
这样做的原因是:无论您实施的分区有多好,数据仍然需要在需要时建立索引并存入内存,对于我们处理多达 500,000 封用户电子邮件的系统来说,这可以简单地成为一个主要硬件随着人们收到邮件的时间问题,将迫使您购买更昂贵的硬件。
MYSQL 中还有另一个隐藏成本,即改变 table 的架构,如果您的 table 很大且资源有限,这将变得不可能。在实际场景中使用 MSSQL 和 Oracle 后,MYSQL 处理元数据更新和索引的方式并没有给我留下深刻印象。
所以简短的回答是不要对你的数据库使用分区,除非你确定你的 table/indexes 不会有重大的架构变化,而且你的 table 也不会增长大.
虽然我不得不说,如果你为你的系统设计了一个好的索引(要非常小心主键,因为这是你在 MYSQL 中的聚集索引,如果你查询主键索引)你可能根本不需要分区(现在在我们的一个安装中,我们有一个 table 和 +450,000,000 条记录,当你使用主键索引查询数据时速度非常快)
另一点是,如果您的数据中有时间顺序,并且您总是有一个日期范围来查询,那么如果您的数据库不会变得太大并且您打算删除旧数据,那么使用分区是个好主意一段时间后(如日志轮换,...)分区可能是最好的选择,因为您可以简单地删除分区而不是编写删除过程。
希望这能帮助您做出正确的决定。
我们目前正在决定 MySQL 数据库中 table 的分区方案。我们有多个分片,我们将所有单个用户记录路由到一个分片。我们还想通过 userid 对 table 本身进行分区。我们对分区有些陌生,希望得到一些关于使用哪种类型的分区以及我们可能需要多久维护一次分区的反馈。
我们使用键分区、线性键、散列和线性散列进行了一些简单的测试。在我们的测试中,散列似乎是最快的插入选项,而且它似乎还使用随机生成的用户 ID 为我们提供了最佳分布。然而,在阅读文档时,我们了解到如果您想合并或优化分区,线性哈希会更好,但我们注意到它在插入时要慢得多。我们真的不明白为什么我们需要合并或优化分区,所以我们不确定这应该引起多大的考虑。
此外……我们计划使用最大分区数(我认为是 1000 个),因为我们看不到这种方法有任何负面影响,它应该通过将每个分区的记录数限制为最大程度。在决定分区数量时有什么我们应该考虑的,还是可以简单地使用 1000 个分区? 有人对此有什么建议吗?
所以对于任何可能对此主题感兴趣的人,这是我的经验:
我们最终决定不使用 MYSQL 分区,而是使用数据库分片。 这样做的原因是:无论您实施的分区有多好,数据仍然需要在需要时建立索引并存入内存,对于我们处理多达 500,000 封用户电子邮件的系统来说,这可以简单地成为一个主要硬件随着人们收到邮件的时间问题,将迫使您购买更昂贵的硬件。
MYSQL 中还有另一个隐藏成本,即改变 table 的架构,如果您的 table 很大且资源有限,这将变得不可能。在实际场景中使用 MSSQL 和 Oracle 后,MYSQL 处理元数据更新和索引的方式并没有给我留下深刻印象。
所以简短的回答是不要对你的数据库使用分区,除非你确定你的 table/indexes 不会有重大的架构变化,而且你的 table 也不会增长大.
虽然我不得不说,如果你为你的系统设计了一个好的索引(要非常小心主键,因为这是你在 MYSQL 中的聚集索引,如果你查询主键索引)你可能根本不需要分区(现在在我们的一个安装中,我们有一个 table 和 +450,000,000 条记录,当你使用主键索引查询数据时速度非常快)
另一点是,如果您的数据中有时间顺序,并且您总是有一个日期范围来查询,那么如果您的数据库不会变得太大并且您打算删除旧数据,那么使用分区是个好主意一段时间后(如日志轮换,...)分区可能是最好的选择,因为您可以简单地删除分区而不是编写删除过程。
希望这能帮助您做出正确的决定。