1

比如说,我想知道一个用户是否有至少 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 

任何我没有想到的全新方法也将受到欢迎

4

2 回答 2

3

“请注意,我只获取 3 个结果,而不是全部……只是想知道获取 3 个结果是否更快或计算一百万条记录更快……因此我提出了这个问题。”

我会加一〜eveevans回答,但这是长答案......

通常,数据库会记录记录的数量并优化查询结果以仅使用该数量。有时他们会保留不同值的数量、具有唯一索引的值的记录数量,或者取决于数据库供应商的实现的任意数量的案例。您的查询可能恰好碰到了他们正在跟踪且优化器可以使用的数字。所以 count(*) 查询通常比选择更快。

接下来,使用“SELECT count(*)”,一行中有一个整数列,这比使用“SELECT *”的结果集要少得多。数据库必须获取记录中所有字段的值。(执行“SELECT id FROM orders LIMIT 3”甚至会有所帮助。)它必须对每个记录的每个字段值进行字节编码。然后客户端适配器必须将字节解码为 ruby​​ 值。然后 ActiveRecord 遍历列的描述并构建属性数组。仅计数就少了很多工作。

于 2012-09-19T19:40:38.807 回答
2

如果您只想要一个数字(计数),请使用选项 B,第一种情况返回所有符合条件的订单,第二种情况只返回符合条件的订单数量。

于 2012-09-19T16:40:13.783 回答