说,我想查找用户是否至少有3个订单
考虑到订单表非常庞大,哪个更好?
一个。将结果集的大小限制为3并查看大小是否匹配
NO_OF_MATCHES = 3
orders = Order.where('user_id = ?', 1).limit(NO_OF_MATCHES )
return true if orders.size == NO_OF_MATCHES
湾只需计算并与之比较
NO_OF_MATCHES = 3
count = Order.count(:conditions => ['user_id = ?',1])
return true if count >= NO_OF_MATCHES
我还欢迎任何我没想过的全新方法
答案 0 :(得分:3)
“请注意,我只获得了3个结果,而不是全部...只是想知道是否更快地获取3个结果或者计算一百万个记录更快..因此我提出了问题。”
我会加上一个~eveevans的答案,但这是一个很长的答案......
通常,数据库将保留记录数量并优化查询结果以仅使用该数字。有时,它们会保留不同值的数量,具有唯一索引的值的记录数,或者依赖于数据库供应商实现的任意数量的情况。您的查询可能碰巧遇到他们正在跟踪的数字,优化程序可以使用。因此,count(*)查询通常比选择更快。
接下来,使用“SELECT count(*)”时,有一行包含一个整数列,这比使用“SELECT *”的结果集少了 lot 。数据库必须获取记录中所有字段的值。 (执行“SELECT id FROM orders LIMIT 3”甚至会有所帮助。)必须对每个记录的每个字段值进行字节编码。然后客户端适配器必须将字节解码为ruby值。然后,ActiveRecord将完成列的描述并构建属性数组。只计算数量就少了很多。
答案 1 :(得分:2)
如果您只想要一个数字(计数),请使用选项B, 第一种情况会返回与条件匹配的所有订单,第二种情况只返回与条件匹配的订单数。