我想知道下面哪种方法更快?
假设:
方法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 |
答案 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中时,这尤其有用。