首页 > 解决方案 > MySQL:所有用户一个数据库或每个用户多个数据库

问题描述

我有一个现有系统(相应地在 PHP、AWS EC2 和 RDS 上的 MYSQL 上)。MySQL(InnoDB)作为数据库的当前统计数据总大小为 600 GB(来自 phymyadmin),包含我的程序需要的近 150 个表。在这两个表(Order、Order_items)中,每个表包含超过 200GB。

在数据库不断增长的同时,我们发现了一些问题。1. 更新任何数据库模式以获取新功能更新需要太多时间。2. 长期保持同一种数据结构好不好,因为随着我们的增长预期更大的数据(进入 TB)?

解决问题1并处理问题。2,我们正在尝试找出解决方案,因此在这里发布一个问题。

我们正在考虑的一种可能方式如下。

我们正在考虑将 Order、Order_items(以及此类更大的表)分开以存储每个用户基础数据库,而不是单个数据库中所有内容的当前结构。因此,对于每个用户,Order、Order_items 将存储在单独的数据库中,并将其他表存储在公共数据库中。(一个主数据库和用于此类条目的 x 客户数据库。)因此数据将被隔离。

此处提到的缺陷是 - 目录结构变得越来越大,以存储每个用户明智的数据库。

获得参考,这表明在较小的数据库中这不是一个好的选择。[ http://datacharmer.blogspot.com/2009/03/normalization-and-Smoking.html ] [可以在 mysql 中创建的数据库的最大限制?] [ https://forums.mysql.com/read.php?20,74692,74705#msg-74705]

当一张表中有较大的数据时,无法清楚地了解该怎么做。

将每个用户的表分开或任何其他可用于满足长期数据增长的选项(上面提到的第 1 点和第 2 点)是一个更好的选择吗?

标签: mysqldatabasedatabase-designarchitecture

解决方案


(在 MySQL 中......)ADATABASE更多的是一种与性能有关的逻辑和管理结构。

在磁盘上,数据库是一个目录;该数据库中的表是该目录中的 1-3 个文件。当您在单个目录中拥有数千个文件或子目录时,操作系统开始窒息。但听起来你并没有达到那个规模。

在 MySQL 中,无论两个表(正在被 JOIN 等)是在同一个数据库(目录)中还是单独的,基本上没有性能差异。

至于“安全”……每个用户都有一个单独的数据库,更容易为不同的用户授予不同的访问权限。仅此一项,就可能是拥有 db-per-user 的原因。

表的大小会对性能产生影响,但我们通常谈论的是十亿行或 TB。即便如此,索引等可能能够控制问题。应该查看一个 200GB 的表,看看您是否有最小大小的数据类型、足够的规范化,但不是过度规范化。适当的索引,尤其是复合索引,而不是额外的索引等。(如果你想追求的话,开始一个新的问题。)

ALTER TABLE影响有问题的一张桌子;数据库结构是什么并不重要。顺便说一句,MySQL 8.0 现在有一些“即时”更改。

你会超出你的一台服务器吗?那你会怎么做?启动另一台服务器,并将一些用户迁移到它?在这种情况下,拥有 db-per-user可能更方便。然后你只需将一个分贝作为一个单位移动;其他一切都保持不变。(也就是说,您已经被用户“分片”了。)

是否有任何表(除了授予表)在用户之间共享?使用 db-per-user,使其成为自己的数据库。

至于何时升级schema,有很多技巧,没有一个是完美的。我会单独查看每个案例。添加列的一种技术是构建一个并行表(垂直分区)来容纳新列。这是零停机时间,但很草率。下次你不能使用这个技巧时,你可以取消对这些列的分区。

对于单个应用程序来说,150 个表似乎很多。

单个表 200GB 听起来您节省的东西比您需要的要多。想想汇总表。

还是我误读了这个问题……你有

  • 一组包含所有用户的 150 个表?
  • 一个数据库有多组 150 个表,每个用户一组?
  • 许多数据库,每个用户一个,每个有 150 个表?

推荐阅读