我有四个表,这些表存储了很多有关某物的信息。该信息可以分为四类。总是查询一类信息,偶尔查询另外三类。
由于所有这些表之间都存在一对一的关系,因此可以将它们存储在一个表中。
我的问题是:什么是更好的性能明智的选择?
一张带有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都是相同的主键(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上的索引也是如此。
使用多个表,更难维护完整性。您将使用外键和插入交易(甚至触发器)?
结论:
这真的取决于您的情况。找出答案的最佳方法是进行测试和基准测试。
关于mysql - 合并具有一对一关系的表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6700021/