MySQL:许多表或许多数据库?
对于一个项目,我们有一堆数据总是具有相同的结构,并没有链接在一起。 有两种方法来保存数据:
- 为每个池创build一个新的数据库(大约15-25个表)
- 在一个数据库中创build所有表,并通过表名区分池。
哪一个更容易和更快处理MySQL?
编辑:我没有在数据库devise问题的意见,我只是在两种可能性中的哪一个更快。
编辑2:我会尽量让它更清楚。 如前所述,我们将有数据,其中一些date很less属于不同的池。 将一个types的所有数据放在一个表中并将其与一个池ID关联起来并不是一个好主意:
- 很难备份/删除一个特定的池(我们预计我们会在一段时间后用尽主键(即使使用大的int))
所以这个想法是为每个池创build一个数据库,或者在一个数据库中创build大量的表。 对数据库的50%的查询将是简单的inserts
。 49%将是主键上的一些简单的selects
。
问题是, MySQL
处理速度有多快? 许多表或许多数据库?
单个数据库中的多个表与不同数据库中的多个表之间应该没有显着的性能差异。
在MySQL中,数据库(标准SQL为此使用术语“模式”)主要作为表的命名空间。 数据库只有一些属性,例如默认的字符集和sorting规则。 使用GRANT
可以方便地控制每个数据库的访问权限,但这与性能无关。
您可以从单个连接访问任何数据库中的表(只要它们由相同的MySQL服务器实例pipe理)。 你只需要限定表名:
SELECT * FROM database17.accounts_table;
这完全是一个语法上的差异。 它应该对性能没有影响。
关于存储,您不能像@Chris推测的那样将表组织成一个文件数据库。 使用MyISAM存储引擎,每个表格总是有一个文件。 使用InnoDB存储引擎,您可以有一组合并所有表的存储文件,或者每个表有一个文件(这是针对整个MySQL服务器configuration的,而不是针对每个数据库的)。 在任何一种情况下,与在许多数据库中相比,在单个数据库中创build表没有性能优势或劣势。
每个数据库没有太多的MySQLconfiguration参数。 影响服务器性能的大多数参数都是服务器范围的。
关于备份,您可以指定一个表的子集作为mysqldump
命令的参数。 备份每个数据库的逻辑表组可能会更方便,而不必命名命令行上的所有表。 但是,性能应该没有什么区别,只有在进入备份命令时方便您。
为什么不创build一个表来跟踪您的池(使用PoolID和PoolName作为列,以及其他任何您想要跟踪的数据),然后在您的15到25个表上添加一个列,一个外键返回给你的表池,这样你就知道该logging属于哪个池了。
如果你不想混合这样的数据,我会build议做多个数据库。 创build多个表的所有function相同,使我的蜘蛛感到刺痛。
如果你不想像TheTXIbuild议的那样使用poolID池名称的一组表,那么使用单独的数据库而不是多个表都可以做同样的事情。
这样,您将访问不同池之间的差异限制在最初的“使用数据库”语句中,您不必每次都重新编码您的SELECT,或者使用dynamicSQL。
这种方法的其他优点是:
- 轻松备份/恢复
- 轻松启动/停止数据库实例。
缺点是:
- 多一点pipe理工作,但不多。
我不知道你的应用程序是什么,但是在创build一个数据库中的所有表之前真的认真思考。 这样疯狂的谎言。
编辑:如果性能是唯一关心你的事情,你需要测量它。 采取一组具有代表性的问题并衡量他们的performance。
编辑2:在许多表/许多数据库模型之间的单个查询的性能差异是可以忽略的。 如果你有一个数据库,你可以调整它。 如果你有很多数据库,你可以把它们全部调出来。
我的(我们的 – 不能说任何人)的观点是,对于调优好的数据库,三个选项(poolid in table,multiple tables,multiple databases)在性能上几乎没有区别,所以您可以从短期和长期中select最容易的选项。
对我来说,最好的select仍然是一个带有poolId的数据库,就像TheTXI所build议的那样,然后是多个数据库,这取决于你的(主要是pipe理)需求。 如果您需要确切地知道两个选项之间的差异,我们不能给您这个答案。 您需要设置并testing它。
使用多个数据库时,为了提高性能,很容易抛硬件。
在你描述的情况下,经验让我相信,当你拥有大量的池时,你会发现独立的数据库会更快。
这里有一个非常重要的基本原则, 不要去想它会变得多快,
我不太清楚,我完全理解你的情况。 你想要所有的池使用相同的表,但只是一个区别键不同? 还是你想要在一个数据库中的单独池池,每个表上的后缀来区分池?
无论哪种方式,你应该有多个数据库有两个主要原因。 首先,如果您必须更改一个池中的模式,则不会影响其他模块。
第二,如果你的负载上升(或任何其他原因),你可能想要将池移动到具有新的数据库服务器的单独的物理机器上。
另外,对数据库服务器的安全访问可以更紧密地locking。
所有这些都可以在不需要单独的数据库的情况下完成 – 但是这种分离将使所有这些变得更加容易,并且减less了精神跟踪你想要操作的表的复杂性。
按表名区分池或将它们放在不同的数据库中大致相同。 但是,如果在一个数据库中有很多表,MySQL必须加载表信息,并在login/连接时对所有这些表进行安全检查。
正如其他人提到的,单独的数据库将允许您移动事物并创build特定于特定池(即压缩表)的优化。 这是额外的pipe理开销,但有相当多的灵活性。
此外,通过使用联合表或合并表,您可以始终“汇集”位于不同数据库中的表,以便根据需要简化查询。
至于用完主键,如果使用MyISAM表,则可以使用复合主键。 例如,如果有一个名为groupCode(any type)的字段,另一个名为sequenceId(auto increment),并将您的主键创build为groupCode + sequenceId。 sequenceId将根据组代码集中的下一个唯一ID递增。 例如:AAA 1 AAA 2 BBB 1 AAA 3 CCC 1 AAA 4 BBB 2 …
虽然对于大表,您必须小心caching,并确保您正在使用的文件系统处理大文件。
我不太了解mysql,但我想我必须给出标准的性能答案 – “这取决于”。
一些想法(只涉及性能/维护,而不涉及数据库devise):
- 创build新的数据库意味着文件系统中的单独文件(或多个文件)。 这些文件可以被放在不同的文件系统上,如果一个文件的执行需要与其他文件系统分离等。
- 新的数据库可能会以不同的方式处理caching; 例如。 一个数据库中的所有表将意味着数据库的共享caching,而将表拆分成不同的数据库意味着每个数据库可以有一个单独的caching[显然,所有数据库将共享相同的caching物理内存,但可能会有一个限制每个数据库等]。
- 与单独的文件相关,这意味着如果您的数据集中的一个变得比其他数据集更重要,那么可以轻松地将其拖放到新的服务器上。
- 分离数据库有一个额外的好处,即允许您比单一数据库更容易地部署更新。
然而,相比之下,拥有多个数据库意味着服务器可能会使用更多的内存(因为它有多个caching)。 我确信多数据库方法有更多的“缺点”,但现在我正在画一个空白。
所以我想我会推荐多数据库方法。 显然,只有在了解到可能有更好的“数据库devise”方式来处理你实际正在做的事情的时候,
考虑到你对它的限制,我宁愿在现有的数据库中增加更多的表,而不是连接到多个数据库。 pipe理连接stringTEND更难,除了pipe理您可能拥有的不同的数据库优化。
FTR,在正常情况下,我会采用TheTXI描述的方法。
在回答你的具体问题时,我发现它依赖于使用。 (我知道了,但是听我说。)
单个数据库可能更容易。 你将不得不担心只有一个连接,并将仍然需要指定表。 多个数据库在某些情况下可能会更快。
如果我是你,我会同时尝试。 我们不可能给你一个有用的答案。