2016-12-16 80 views
0

我想知道下面哪种方法更快?1表查询与连接多个表查询性能

假设:

  • 最大10,000种产品,每种产品都有1个用户ID,1个猫ID,3个额外的字段,以及5张图片。
  • 90-99%的用户来到网站只是为了获取信息,而不是发布。

方法1:从查询得到一个表中的所有数据,而 “加盟”:

SELECT * FROM products WHERE ... 

表:产品

id | name | poster_name | cat_name | code_1 | code_2 | content | 
     dimensions | contact | message | images | 

方法2:得到的所有数据带“JOIN”的多个表格:

SELECT ... FROM products 
      LEFT JOIN cats ON products.cat_id = casts.id 
      LEFT JOIN users ON .... 

表:产品

id | name | code_1 | code_2 | content | cat_id | poster_id | 

表:猫

id | cat_name | 

表:用户

id | poster_name | 

表:额外

id | product_id | extra_info | extra_data | 

表:图像

id | product_id | img_src | 
+2

什么是JOINT? – Agalo

+0

@Agalo我用记事本来代替输入错误,然后得到另一个错字=))抱歉 –

+0

查询的性能取决于很多事情,并且可能因系统而异。例如,你是否定义了任何索引?这些表中有多少条记录?一个表上的查询几乎总是比连接快,但它依赖于其他事情。如果您的一个表查询获得了一百万条记录,但您的连接只取得10条记录,则该连接可能(但不一定)会更快。很明显,对你而言,简单的测试就是最好的答案。 –

回答

1

第一种方法通常会更快读取,第二个将帮助您维护数据的完整性,通常会更快写作。

从后面的形式到前者的转换称为denormalization,通常用于数据仓库,而操作(“活动”)数据库通常更喜欢后面的形式(第二种方法)。

+0

如果大多数用户(90-95%)只是访问阅读网站上的信息。而且数据库结构不需要经常更改。在这种情况下,方法1更好吗? –

+0

这取决于您的特定设置和需求。如果我确信我绝对需要提高性能,并且不能以其他方式获得(例如,改进索引,调整执行计划等),我个人只会考虑方法1。另请注意,方法1消耗更多空间。 –

+0

当你说“方法1占用更多空间”时。这意味着你在组合表中计算了NULL值,如果我使用方法2:我可以保存这些空间?我想如果所有的字段都包含数据,这两种方法都会占据相同的空间。 –

1

你还没有完成提问。方法2没有WHERE,所以它将提供10K行,并且必须对其他表执行20K查找。这使它成为失败者。

由于您的真的问题是关于性能,那么让我们来讨论WHERE条款。因此,我们可以对其进行优化,以使所需的数据趋向于RAM中。

回到你的问题... JOIN可能是“正确”的方式来做到这一点。假设你有适当的索引,那么它的性能并没有太大的提高。所以提供SHOW CREATE TABLE(即使是暂定的)和完整的WHERE条款。

不要过度归一化。例如,不要标准化日期时间或任何其他“连续”值。

规范化可以节省空间,特别是在巨大的表格中(例如,数百万或数十亿行,以及规格化的大型,频繁重复的字符串)。当表格太大而无法保留在RAM中时,这特别有用。