Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 我的SQL分区建议_Mysql_Database_Hash_Partitioning_Sharding - Fatal编程技术网

Mysql 我的SQL分区建议

Mysql 我的SQL分区建议,mysql,database,hash,partitioning,sharding,Mysql,Database,Hash,Partitioning,Sharding,我们目前正在决定MySQL数据库中表的分区方案。我们有多个碎片,我们将单个用户的所有记录路由到一个碎片。我们还希望通过userid对表本身进行分区。我们对分区有些陌生,希望得到一些关于使用哪种类型的分区以及维护分区的频率的反馈 我们使用按键、线性键、散列和线性散列进行了一些简单的测试。在我们的测试中,哈希似乎是插入的最快选项,而且它似乎还使用随机生成的用户ID为我们提供了最佳的分发。然而,在阅读文档时,我们了解到,如果您想要合并或优化分区,那么线性哈希会更好,但是我们注意到它在插入时要慢得多。我

我们目前正在决定MySQL数据库中表的分区方案。我们有多个碎片,我们将单个用户的所有记录路由到一个碎片。我们还希望通过userid对表本身进行分区。我们对分区有些陌生,希望得到一些关于使用哪种类型的分区以及维护分区的频率的反馈

我们使用按键、线性键、散列和线性散列进行了一些简单的测试。在我们的测试中,哈希似乎是插入的最快选项,而且它似乎还使用随机生成的用户ID为我们提供了最佳的分发。然而,在阅读文档时,我们了解到,如果您想要合并或优化分区,那么线性哈希会更好,但是我们注意到它在插入时要慢得多。我们真的不明白为什么我们需要合并或优化分区,所以我们不确定这应该考虑多少

此外,我们计划使用最大数量的分区(我想是1000个),因为我们看不到这种方法有任何负面影响,它应该通过最大限度地限制每个分区的记录数量来提供最佳性能。在决定分区的数量时,我们是否应该考虑什么,或者只使用1000个分区是否可以?
有人对此有什么建议吗?

因此,对于任何可能对此话题感兴趣的人,以下是我的经验:

我们最终决定不使用MYSQL移植,而是使用数据库分片。 原因是:无论您如何很好地实现该分配,仍然存在这样一个事实,即数据需要编制索引并在需要时放入内存,对于我们处理多达500000封用户电子邮件的系统来说,随着时间的推移,这可能会成为一个主要的硬件问题,因为人们会收到邮件,并将迫使您购买更多昂贵的硬件

此外,MYSQL中还有另一个隐藏的成本,那就是改变表模式,如果您有一个大表和有限的资源,这可能变得不可能。在真实场景中使用MSSQL和Oracle之后,MYSQL处理元数据更新和索引的方式并没有给我留下深刻印象

因此,简短的回答是,除非您确信不会对表/索引进行重大的模式更改,并且表不会增长太大,否则不要对数据库使用分区

尽管我不得不说,如果你为你的系统设计了一个好的索引(对主键要非常小心,因为这是你在MYSQL中的聚集索引,如果你在主键索引上查询,你的查询会更加高效),你可能根本不需要进行分配(现在在我们的一个安装中,我们有一个包含+450000000条记录的表,使用主键索引查询数据时速度非常快)

另一点是,如果数据中有一个年表,并且您总是要查询一个日期范围,那么如果您的数据库不太大,并且您打算在一段时间后删除旧数据(如日志轮换,…),则最好使用分区分区可能是最好的选择,因为您可以简单地删除分区,而不是编写删除进程


希望这能帮助您做出正确的决策。

您进行了基准测试吗?这是一个相当大的步骤,可能99.9%的用例都不需要。我正在做一些基准测试,主要关注数据分布,我可以看到散列和线性散列与数据分布一样安静,但性能似乎有点散列执行所有其他操作。您正在执行什么类型的写入?是每个用户基于时间的日志数据,还是更改为一个用户的数据?这主要是一个邮件元数据表,用于存储用户的邮件信息(而不是正文).由于新邮件不断出现,邮件被删除,邮件元数据被更新(已读/未读/已标记等),因此该表的读/写量相当大当用户列出他们的邮箱或在下载物理邮件之前使用元数据来种子IMAP响应时。该系统将支持数百万用户,因此我们采用了分片和分区策略。我在其他论坛上没有给你一个“否”的回答吗?