我正在运行一个财务相关的门户网站,涉及数百万的借记信用交易在MySQL中,得到一个特定用户的余额在一定的限制,即与300万行变得缓慢。现在,我正在考虑为每个用户创建单独的MySQL容器,并在每个容器中只记录相关的用户事务,我相信这将是快速计算任何用户的余额。我有大约20万用户,我想知道为每个用户创建单独的MySQL容器是否可行?或者我应该采取任何其他方法。谢谢
f0brbegy1#
我不建议为每个用户提供单独的MySQL示例。我在以前的工作中在Docker容器中运行MySQL。即使在非常强大的服务器上,我们也只能在每台服务器上运行大约30个MySQL示例,否则就会耗尽资源。如果每个示例在大多数时间都处于空闲状态,可能会运行更多的示例。无论如何,您将需要数百或数千台服务器来完成您所描述的任务,并且随着用户数量的增加,您需要不断添加服务器。您是否考虑过,如果每个用户的数据位于不同的MySQL示例中,您将如何生成报表?生成有关任何单个用户的报表都可以,但您可能还需要有关所有用户的汇总财务活动的报表。您无法运行跨MySQL示例的单个查询,因此您必须对每个示例执行一个查询,并编写自定义代码来合并结果。当您需要执行备份、升级、模式更改、错误监视等操作时,您也将有更多的工作要做。这些操作任务中的每一项都将乘以示例的数量。你没有描述你的数据是如何组织的,也没有描述你运行的任何特定查询,但是有一些技术可以优化查询,而不需要将数据拆分到多个MySQL示例中。这些技术包括索引、缓存、分区或升级到更强大的服务器。在拆分数据之前,你应该学习这些优化技术。因为最终得到的只是数千个没有经过充分优化的小示例。
bq8i3lrv2#
我有大约2万个用户,我想知道为每个用户创建单独MySQL容器是否可行不,绝对不是。虽然Docker容器相对较轻,但其中的20 K是很多的,这将需要大量额外的资源(内存、磁盘、CPU)。在某个限制(即3百万行)下获得特定用户的余额变得缓慢。有几件事你可以尝试去做。1.首先,尝试优化数据库/查询(可以与垂直扩展相结合-通过为数据库使用更强大的服务器)1.启用复制(如果尚未启用)并使用辅助示例进行读取查询1.使用partitioning and/or sharding
ckx4rj1h3#
我知道这是亵渎神灵的,但对于这样的表,我喜欢使用两个表。(顽皮的部分是冗余。)
您似乎只有History,但经常需要为单个用户计算Current。如果您在运行时维护它,它将运行得更快。此外,我将做以下工作:
History
Current
UPDATE
DELETE
PRIMARY KEY(id), INDEX(user_id)
至
PRIMARY KEY(user_id, id), -- clusters a user's rows together INDEX(id) -- this keeps AUTO_INCREMENT happy
3条答案
按热度按时间f0brbegy1#
我不建议为每个用户提供单独的MySQL示例。
我在以前的工作中在Docker容器中运行MySQL。即使在非常强大的服务器上,我们也只能在每台服务器上运行大约30个MySQL示例,否则就会耗尽资源。如果每个示例在大多数时间都处于空闲状态,可能会运行更多的示例。无论如何,您将需要数百或数千台服务器来完成您所描述的任务,并且随着用户数量的增加,您需要不断添加服务器。
您是否考虑过,如果每个用户的数据位于不同的MySQL示例中,您将如何生成报表?生成有关任何单个用户的报表都可以,但您可能还需要有关所有用户的汇总财务活动的报表。您无法运行跨MySQL示例的单个查询,因此您必须对每个示例执行一个查询,并编写自定义代码来合并结果。
当您需要执行备份、升级、模式更改、错误监视等操作时,您也将有更多的工作要做。这些操作任务中的每一项都将乘以示例的数量。
你没有描述你的数据是如何组织的,也没有描述你运行的任何特定查询,但是有一些技术可以优化查询,而不需要将数据拆分到多个MySQL示例中。这些技术包括索引、缓存、分区或升级到更强大的服务器。在拆分数据之前,你应该学习这些优化技术。因为最终得到的只是数千个没有经过充分优化的小示例。
bq8i3lrv2#
我有大约2万个用户,我想知道为每个用户创建单独MySQL容器是否可行
不,绝对不是。虽然Docker容器相对较轻,但其中的20 K是很多的,这将需要大量额外的资源(内存、磁盘、CPU)。
在某个限制(即3百万行)下获得特定用户的余额变得缓慢。
有几件事你可以尝试去做。
1.首先,尝试优化数据库/查询(可以与垂直扩展相结合-通过为数据库使用更强大的服务器)
1.启用复制(如果尚未启用)并使用辅助示例进行读取查询
1.使用partitioning and/or sharding
ckx4rj1h3#
我知道这是亵渎神灵的,但对于这样的表,我喜欢使用两个表。(顽皮的部分是冗余。)
您似乎只有
History
,但经常需要为单个用户计算Current
。如果您在运行时维护它,它将运行得更快。此外,我将做以下工作:
History
中添加一行,并更新Current中的一行。History
中添加UPDATE
或DELETE
行。如果需要更正,则添加另一行,比如说,添加一个负金额。(我认为,无论如何,这都是“正确的”会计实践。)至