where 子句和使用关联对象来提高性能之间有啥区别吗
Posted
技术标签:
【中文标题】where 子句和使用关联对象来提高性能之间有啥区别吗【英文标题】:is there any difference between where clause and using association object for performancewhere 子句和使用关联对象来提高性能之间有什么区别吗 【发布时间】:2021-05-11 20:36:58 【问题描述】:例如,我们在产品和订单之间建立了关联。 下面写的这两个查询之间会有什么区别吗? 你在执行时间和性能方面都一样吗
@products = @order.products
@products = Product.where(order_id: @order.id)
或者我们可以以任何方式改进上述查询吗?
【问题讨论】:
【参考方案1】:他们做同样的事情。如果您在控制台中运行查询,您将看到类似这样的内容
Order Load (0.3ms) SELECT "orders".* from "orders" WHERE "orders"."id" = $1 LIMIT $2, [["ID", 1], "LIMIT", 1]
Product Load (0.3ms) SELECT "products".* from "products" WHERE "products"."order_id" = $1 [["ORDER_ID", 1]]
【讨论】:
我知道他们都做同样的事情,但哪一个对执行时间和性能有好处? 它们都是一样的。在两者中,它都需要找到订单,然后为该订单选择产品。性能调整将取决于你想用它做什么。您是否要访问每种产品的任何订单信息?如果是这样,那么您将需要立即加载订单,@order.products.include(:order) 或 Product.include(:order).where(order_id: @order.id) 约定将规定第一个选项。 @order.products 是否在第一次执行后从缓存中获取数据,如果每次都从数据库中获取数据? P几乎所有查询在第一次执行后都会使用缓存【参考方案2】:他们都做同样的事情,性能是一样的。这些查询将使用订单 ID 从产品表中获取产品。相关的sql查询会一样。
唯一的区别是,如果您在加载订单之前使用了预加载,则此查询将在内存中运行,因为相关产品已经加载: @products = @order.products
【讨论】:
以上是关于where 子句和使用关联对象来提高性能之间有啥区别吗的主要内容,如果未能解决你的问题,请参考以下文章
使用 Node 和 sequelize 关联对象的 Where 子句
Java 中 给一个object 赋值属性, 既可以用构造函数的方式,也可以用setXXXX()的方式,而它们之间有啥区
使用 Eloquent 在 Laravel 中使用 where 子句访问嵌套的相关对象