1

MySQL/PHP:我有以下情况:我将在一台服务器上多次安装一个包含大约 70 个表的软件(要明确:这是一个 MyBB 论坛)。比如说,我将安装 500 次(例如,500 个不同的论坛,例如 10 个不同的主题和 5 种不同的语言)。

我正在查看以下选项:

  1. 将所有论坛存储在一个模式中,并更改每个论坛的前缀。
  2. 将每个论坛存储在不同的模式、相同的前缀中。
  3. 只创建一组 70 个表,并为每个表附加一个“forumID”以供选择。
  4. 创建多组 70 个表,为每个表附加一个 forumID,并将一组表用于约 10-100 个论坛。

对于 1 和 2,我不必更改大部分 MyBB 代码(易于维护),对于 3 和 4,我必须编写某种搜索模式以用于每个查询以检测所有选定的表和附加 WHERE 子句(或者如果不存在则创建它)也考虑 forumID(难以维护)。

如果我要通过 MyBB 维护来判断这一点,它将是前两个选项之一。但我还应该考虑:对于 MySQL 服务器来说,什么性能更高、速度更快?

谢谢,克里斯

/edit:所有论坛都将使用相同的代码。我不想维护这个东西的500个不同的安装......

4

3 回答 3

1

我只是复制架构公关。论坛。

论据:

  1. 这是一个易于自动化的过程,自动化它可能比重写所有 SQL 语句以使用“forumid”列更快。
  2. 该解决方案将允许您轻松扩展到新硬件。扩展数据库总是复杂且昂贵的(与扩展实例网络服务器相比)。
  3. 将每个论坛分开还可以让您将前 5 个论坛转移到单独的机器上。如果这是您从中赚钱的东西,您可以拥有“高级论坛”(每台服务器 10 个,x$/月)和“免费增值论坛”(免费,但它们都在一台服务器上,没有性能保证)
  4. 如果您有 500 个不同的论坛,那么每个论坛的利用率都会有很大差异。任何允许您为每个论坛使用不同表的解决方案都将导致数据库服务器上的缓存命中率更高,因为它能够更有效地缓存(而缓存命中率是高数据库性能)
于 2012-06-15T20:04:49.473 回答
1

我认为您应该忘记选项 3 和 4,因为:

  • 表演

你的表会变大,它们的索引也会变大。较大的索引意味着较慢的插入。选择可能不会受到太大影响。

据我所知,所有缓冲区和缓存都是实例范围的,因此在这方面,所有选项都是等效的。

  • 行政

重构代码的麻烦,加上每次升级后需要重做工作(对我来说)足以放弃这个想法。此外,即使是升级程序也可能需要调整以适应您的自定义布局。

您可能希望单独备份和恢复您的论坛。然后你需要自己编写备份脚本,mysqldump在这种情况下无能为力。并在每次添加新表时更新备份脚本(可能在升级期间发生)。

在升级过程中,数据库结构可能会发生变化。一口气改变整个结构可能听起来令人震惊。但是您将需要同时关闭所有 500 个论坛,并进行非常长的结构更改,而不是 500 个更小、更快的更改。

  • 可扩展性

(主要适用于选项 4)如果需要,将一个单独的论坛数据库移动到另一台服务器似乎更困难。

  • 安全

如果入侵者破坏了您的应用程序,我相信她更容易访问所有论坛,但这只是一个疯狂的猜测。


选项 1 和 2 的性能一样好,表是否在同一个数据库上只是语法问题。

我偏爱选项 2,因为它更容易在每个数据库的基础上授予访问权限。

于 2012-06-15T20:13:52.307 回答
0

我会选择替代方案 3(在其他表上创建一个论坛表和一个 forumID 列)。

通过这种方式,您可以从您的应用程序创建新论坛,而无需管理不同的模式或表。

在我看来,进行模式更改比在论坛表中创建新行要差一个数量级。

于 2012-06-15T18:52:11.363 回答