我有四张表存储了很多关于某事的信息。该信息可以分为四类。始终查询一类信息,偶尔查询其他三类信息。
由于所有这些表之间存在一对一的关系,因此可以将它们存储在一个表中。
我的问题是:明智的表现会更好吗?
包含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
是包含相应列的表格
答案 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 uv
和SELECT * FROM xyz INNER JOIN uv ON xyz.id = uv.id
。即使关系是可选的,您也可以有效地使用LEFT JOIN
。
通常一个人不会SELECT *
,而只会根据需要选择列。