MySQL:许多表或许多数据库?

时间:2009-03-30 10:22:44

标签: mysql performance

对于一个项目,我们有一堆数据总是具有相同的结构并且没有链接在一起。 有两种方法可以保存数据:

  • 为每个池创建一个新数据库(大约15-25个表)
  • 在一个数据库中创建所有表,并按表名称区分池。

哪一个更容易,更快地处理MySQL?

编辑:我对数据库设计问题并不感兴趣,我只是介意两种可能性中哪一种更快。

编辑2:我会尽量让它更清晰。如上所述,我们将拥有数据,其中一些日期很少在不同的池中共同存在。将一种类型的所有数据放在一个表中并将其与池ID相关联不是一个好主意:

  • 很难备份/删除特定的池(我们希望我们在一段时间后用完主键(即使使用big int))。

因此,我们的想法是为每个池创建一个数据库,或者在一个数据库中创建大量表。对数据库的50%查询将是简单的inserts

,49%将是主键上的一些简单selects

问题是,MySQL的处理速度有多快?许多表或许多数据库?

9 个答案:

答案 0 :(得分:70)

单个数据库中的多个表与不同数据库中的多个表之间应该没有显着的性能差异。

在MySQL中,数据库(标准SQL为此使用术语“模式”)主要用作表的命名空间。数据库只有几个属性,例如默认字符集和排序规则。使用GRANT可以方便地控制每个数据库的访问权限,但这与性能无关。

您可以从单个连接访问任何数据库中的表(前提是它们由同一个MySQL服务器实例管理)。您只需要限定表名:

SELECT * FROM database17.accounts_table;

这纯粹是一种语法差异。它应该对性能没有影响。

关于存储,您无法像@Chris推测的那样将表组织到每个数据库的文件中。使用MyISAM存储引擎,每个表总是有一个文件。使用InnoDB存储引擎,您可以拥有一组合并所有表的存储文件,或者每个表都有一个文件(这是为整个MySQL服务器而不是每个数据库配置的)。在任何一种情况下,与单个数据库相比,在单个数据库中创建表没有性能优势或劣势。

每个数据库的MySQL配置参数不多。影响服务器性能的大多数参数都是服务器范围的。

关于备份,您可以将表的子集指定为mysqldump命令的参数。为每个数据库备份逻辑表集可能更方便,而无需在命令行上命名所有表。但它应该对性能没有任何影响,只有在您输入备份命令时才能方便。

答案 1 :(得分:25)

为什么不创建一个表来跟踪你的池(使用PoolID和PoolName作为列,以及你想要跟踪的任何其他内容),然后在你的15-25个表上,你将在所有这些表上添加一列这将是一个返回到您的池表的外键,以便您知道该特定记录属于哪个池。

如果您不想混合这样的数据,我建议制作多个数据库。为相同的功能创建所有多个表使我的蜘蛛感觉刺痛。

答案 2 :(得分:13)

如果您不希望将一组具有poolID poolname的表作为TheTXI建议使用,请使用单独的数据库而不是多个表来执行相同的操作。

这样,您可以限制访问不同池与初始“use database”语句之间的差异,您不必每次都重新编码SELECT,或者拥有动态sql。

这种方法的其他优点是:

  • 轻松备份/恢复
  • 轻松启动/停止数据库实例。

缺点是:

  • 多一点管理工作,但不多。

我不知道您的应用程序是什么,但在创建一个数据库中的所有表之前,确实要仔细考虑。这就是疯狂。

编辑:如果性能是唯一与您有关的事情,那么您需要对其进行衡量。采取一组有代表性的查询并衡量其表现。

编辑2:许多表/多数据库模型之间的单个查询的性能差异将是可以忽略的。如果你有一个数据库,你可以调整它的地狱。如果你有很多数据库,你可以调整所有数据库。

我的(我们的? - 不能代表其他人说)重点是,对于调整良好的数据库,三个选项之间的性能几乎没有差别(表中的poolid,多个表,多个数据库) ),所以你可以在短期和长期选择最容易的选项。

对我来说,最好的选择仍然是一个带有poolId的数据库,正如TheTXI建议的那样,然后是多个数据库,这取决于你(主要是管理层)的需求。如果您需要确切知道两个选项之间的性能差异,我们无法给出答案。您需要进行设置并进行测试。

使用多个数据库,可以轻松地将硬件投入其中以提高性能。

答案 3 :(得分:6)

在您描述的情况下,经验让我相信,当您拥有大量游泳池时,您会发现单独的数据库会更快。

这里有一个非常重要的一般原则可供观察:不要考虑它的速度,概述它。

答案 4 :(得分:4)

我不太确定我完全理解你的情景。您是否希望所有池使用相同的表,但只是区别于一个区别键?或者您是否希望在一个数据库中使用单独的表池,并在每个表上使用后缀来区分池?

无论哪种方式,您应该有多个数据库,主要有两个原因。第一种情况是,如果您必须更改一个池上的架构,它将不会影响其他池。

第二,如果负载上升(或出于任何其他原因),您可能希望将池移动到具有新数据库服务器的单独物理机上。

此外,可以更严格地锁定对数据库服务器的安全性访问。

所有这些事情仍然可以在不需要单独的数据库的情况下完成 - 但这种分离将使所有这些更容易,并降低必须精神上跟踪您想要操作的表的复杂性。

答案 5 :(得分:3)

通过表名来区分池或将它们放在不同的数据库中是完全相同的。但是,如果一个数据库中有很多表,MySQL必须加载表信息,并在登录/连接时对所有这些表进行安全检查。

正如其他人所提到的,单独的数据库将允许您转移事物并创建特定于特定池(即压缩表)的优化。这是额外的管理开销,但有更大的灵活性。

此外,您可以使用联合表或合并表始终“汇集”位于不同数据库中的表,以便在需要时简化查询。

对于主键耗尽,如果使用MyISAM表,则始终可以使用复合主键。例如,如果您有一个名为groupCode(任何类型)的字段,另一个名为sequenceId(自动增量),则将主键创建为groupCode + sequenceId。 sequenceId将根据组代码集中的下一个唯一ID递增。 例如: AAA 1 AAA 2 BBB 1 AAA 3 CCC 1 AAA 4 BBB 2 ...

虽然对于大型表,您必须小心缓存,并确保您使用的文件系统处理大文件。

答案 6 :(得分:2)

我不太了解mysql,但我认为我必须给出标准的性能答案 - “这取决于”。

一些想法(仅涉及性能/维护,而不是数据库设计):

  • 创建新数据库意味着文件系统中的单独文件(或多个文件)。然后,如果一个文件的性能需要与其他文件系统分开等,则可以将这些文件放在不同的文件系统上。
  • 新数据库可能会以不同方式处理缓存;例如。一个DB中的所有表都意味着DB的共享缓存,而将表拆分为单独的数据库意味着每个数据库可以有一个单独的缓存[显然所有数据库将共享相同的物理内存用于缓存,但可能存在限制每个数据库等]。
  • 与单独的文件相关,这意味着如果您的某个数据集变得比其他数据集更重要,则可以轻松将其拉出到新服务器。
  • 分离数据库还有一个额外的好处,即允许您比单个数据库更容易一次部署更新。

然而,相比之下,拥有多个数据库意味着服务器可能会使用更多内存(因为它有多个缓存)。我确信多数据库方法还有更多的“缺点”,但我现在画了一个空白。

所以我想我会推荐多数据库方法。显然,只有理解的是,很可能有一种更好的“数据库设计”方式来处理你实际做的事情。

答案 7 :(得分:2)

鉴于您对它的限制,我宁愿在现有数据库中启动更多表,而不是必须连接到多个数据库。除了管理您可能拥有的不同数据库优化之外,管理连接字符串TEND更难。

答案 8 :(得分:2)

FTR,在正常情况下,我会采用TheTXI描述的方法。

在回答您的具体问题时,我发现它取决于使用情况。 (警告我知道,但是听我说。)

单个数据库可能更容易。您将不得不担心只有一个连接,仍然需要指定表。在某些情况下,多个数据库可能会更快。

如果我是你,我会尝试两者。我们无法为您提供有用的答案。