1表查询vs连接多表查询性能

时间:2016-12-16 19:27:53

标签: php mysql sql performance

我想知道下面哪种方法更快?

假设:

  • 最多10,000个产品,每个产品有1个用户ID,1个猫ID,3个额外字段和5个图像。
  • 90-99%的用户只是为了获取信息而访问网站。

方法1:从查询中获取表中的所有数据而不使用" JOIN":

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 |

table:images

id | product_id | img_src |

2 个答案:

答案 0 :(得分:1)

第一种方法通常读取速度更快,第二种方法可以帮助您保持数据完整性,通常写入速度更快。

从后一种形式到前者的过渡称为denormalization,通常用于数据仓库,而操作(“实时”)数据库通常更喜欢后一种形式(第二种方法)。

答案 1 :(得分:1)

你还没有完成提问。方法2没有Meteor.subscribe('getOrgDetail', {status:'active'},function(){ var sub = this; self.setState({'subscriptions.orgs':sub{id:Organizations.find().fetch()}); }); ,因此它将提供10K行,并且必须对其他表执行20K查找。这使它成为失败者。

由于您的真正的问题与性能有关,那么让我们讨论WHERE子句。有了它,我们可以优化它,以便所需的数据往往在RAM中。

回到你的问题...... WHERE可能是'正确'的方法。假设您拥有正确的索引,并没有太大的性能影响。因此,请提供JOIN(即使是暂定的)和完整的SHOW CREATE TABLE条款。

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

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