我有一个现有系统(相应地,在PHP,AWS EC2和RDS上为MYSQL)。 MySQL(InnoDB)作为数据库的当前统计总大小为600 GB(来自phymyadmin),其中包含我的程序需要的近150个表。这两个表(Order,Order_items)中每个表都包含200GB以上。
随着数据库的增长,我们在几件事中发现了问题。 1.在任何数据库模式中进行更新以获取新功能更新都需要花费大量时间。 2.保持相同类型的数据结构以长期运行是否很好,因为随着我们的成长,期望会有更大的数据(进入TB)?
解决第一个问题并处理第一个问题。 2,我们试图找出解决方案,因此在这里发布了一个问题。
我们正在思考的一种可能方法如下。
我们正在考虑将Order,Order_items(以及此类更大的表)分开存储,以存储每个用户基础数据库,而不是单个数据库中所有内容的当前结构。 因此,对于每个用户,Order,Order_items将存储在单独的数据库中,并将其他表保留在公共数据库中。 (一个主数据库,x个客户数据库用于此类条目。)因此,数据将被隔离。
在此提及的陷阱为 -目录结构越来越大,可以存储每个用户的明智DB。
获取参考资料表明,当数据库较小时,这不是一个好选择。 [http://datacharmer.blogspot.com/2009/03/normalization-and-smoking.html] [max limit of databases that can be created in mysql?] [https://forums.mysql.com/read.php?20,74692,74705#msg-74705]
在一个表中包含较大数据时,无法清晰地看到要做什么。
将每个用户分开表还是更好的选择来满足长期数据增长的需求(上面提到的第1点和第2点)会更好吗?
答案 0 :(得分:1)
(在MySQL中...)DATABASE
更多地是与性能有关的逻辑和管理结构。
在磁盘上,数据库是目录;该数据库中的表是该目录中的1-3个文件。当您在一个目录中有成千上万个文件或子目录时,操作系统就会开始阻塞。但这听起来并不像您要达到那样的规模。
在MySQL中,无论两个表(正在联接等)是在同一个数据库(目录)中还是在单独的目录中,基本上没有性能差异。
关于“安全性” ...通过为每个用户使用单独的数据库,可以更轻松地为不同的用户赋予不同的访问权限。单单这可能是每个用户拥有db的原因。
表的大小可能会影响性能,但是我们通常谈论的是十亿行或TB。即使这样,索引等仍可以控制问题。应该查看200GB的表,以查看是否具有最小大小的数据类型,足够的规范化但没有过度规范化。适当的索引,尤其是组合索引,而不是多余的索引等。(如果要继续使用,请提出一个新问题。)
ALTER TABLE
影响所讨论的一个表;数据库结构是什么都没有关系。顺便说一句,MySQL 8.0现在具有一些“即时”更改。
您将不再使用一台服务器吗?那你该怎么办启动另一台服务器,然后将一些用户迁移到该服务器?在这种情况下,每个用户拥有db 可能更为方便。然后,您只需将一个db作为一个单元移动;所有其他都保持不变。 (也就是说,您已经被用户“分片”。)
用户之间是否共享任何表(除了Grant表)?使用每用户数据库,使其成为自己的数据库。
关于何时升级架构,有很多技术,没有一种是完美的。我将逐一研究每种情况。添加列的一种技术是构建并行表(垂直分区)以容纳新列。这是零停机时间,但是草率。下次您无法使用此技巧时,可以取消对这些列的分区。
单个应用程序可能有150张桌子。
一张桌子的200GB听起来好像您节省了很多东西。考虑一下汇总表。
还是我看错了问题...你有