我有四个表,其中存储了有关某事物的大量信息。这些信息可以分为四类。一类信息总是被查询,而其他三类信息则偶尔被查询。
由于所有这些表之间存在一对一的关系,因此它们可以存储在一个表中。
我的问题是:什么是更好的性能?
一张包含
SELECT id, x, y, z FROM all
和SELECT id, u, v FROM all
等查询的表包含
SELECT * FROM xyz
和SELECT * FROM uv
等查询的多个表
(其中 id
、 u
、 v
、 x
、 y
和 z
是列, all
是包含所有列和 xyz
的表uv
是具有相应列的表格)
最佳答案
这确实取决于。
理论上,关系数据库是为了在表之间建立有效的关系。因此,如果 a.x 和 b.x 相同,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
一样快主键(eq_ref 连接)。
示例:
由于记录在磁盘上的物理位置,从一个大表中选择多个连续行比从两个小表中选择多个连续行稍快。
除非不同的表位于不同的硬盘上,在这种情况下MySQL可以并行地获取它们。
但这也可以使用 PARTITIONING 通过一张表来完成。
如果某些查询比其他查询运行得更频繁,您可能需要首先针对这些查询进行优化。也许覆盖索引可以解决您的问题?
使用多个表也会重复主键。但话又说回来,InnoDB 上的索引也是如此。
对于多个表,维护完整性变得更加困难。您将使用外键和事务来进行插入(甚至触发器?)
结论:
这实际上取决于您的情况。找出答案的最佳方法是测试和基准测试。
关于mysql - 将表与一对一关系组合起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6700021/