将表与一对一关系组合在一起

时间:2011-07-14 21:15:45

标签: mysql sql database performance

我有四张表存储了很多关于某事的信息。该信息可以分为四类。始终查询一类信息,偶尔查询其他三类信息。

由于所有这些表之间存在一对一的关系,因此可以将它们存储在一个表中。

我的问题是:明智的表现会更好吗?

  • 包含SELECT id, x, y, z FROM allSELECT id, u, v FROM all

  • 等查询的一个表格
  • 包含SELECT * FROM xyzSELECT * FROM uv

  • 等查询的多个表格

(其中iduvxyz为列,all为包含所有列的表,xyzuv是包含相应列的表格

2 个答案:

答案 0 :(得分:2)

这真的取决于。

理论上,关系数据库可以有效地建立表格之间的关系。因此,如果a.x和b.x都是相同的主键(eq_ref连接),SELECT a.x, a.y, a.z FROM a应该与SELECT a.x, a.y, b.z from a JOIN b ON a.x = b.x一样快。

示例:

  • 由于磁盘上记录的物理位置,从一个大表中选择多个连续行将比从两个小表中选择稍快一些。

  • 除非不同的表位于不同的硬盘上,否则MySQL可以并行获取它们。

  • 但也可以使用PARTITIONING在一张桌子上完成。

  • 如果某些查询的运行频率高于其他查询,您可能需要先对其进行优化。也许覆盖索引可以解决您的问题?

  • 使用多个表也会重复主键。但是,InnoDB上的索引也是如此。

  • 使用多个表格时,更难以保持完整性。您将使用FOREIGN KEYS和插入事务(甚至触发器?)

结论:

这实际上取决于你的情况。找出答案的最佳方法是测试和基准测试。

答案 1 :(得分:0)

取决于很多因素。

通常情况下,如果存在1-1关系,您可以轻松地执行SELECT * FROM xyz SELECT * FROM uvSELECT * FROM xyz INNER JOIN uv ON xyz.id = uv.id。即使关系是可选的,您也可以有效地使用LEFT JOIN

通常一个人不会SELECT *,而只会根据需要选择列。