sql – 在Ruby on Rails中采用vs第一个性能
这是一个有关ActiveRecord查询方法的问题:
> first查找第一条记录(如果提供了参数,则为前N条记录).如果没有定义顺序,它将按主键排序. 用例: User.where(email: 'f@example.com') 这里, SELECT "users".* FROM "users" WHERE "users"."email" = 'f@example.com' ORDER BY "users"."id"` ASC LIMIT 1 采取生成 SELECT "users".* FROM "users" WHERE "users"."email" = 'f@example.com' LIMIT 1 所以如上所示,首先添加额外的排序子句.我想知道take vs first之间是否存在性能差异. 比第一次要快,反之亦然吗? 解决方法一般来说,“take”将更快,因为数据库不必标识符合条件的所有行,然后对它们进行排序并找到最低排序行. “take”允许数据库在找到单个行后立即停止.它的速度越快,将会根据以下因素而变化: >保存多少时间,无需查找多行.最糟糕的情况是需要对一张大桌子进行全面扫描,但扫描时间很早就找到了一个匹配的行. “take”将允许扫描被停止. 还有一些其他因素需要考虑 – 例如对于“第一”查询,优化器可能能够通过扫描主键索引来访问表,并检查每一行以查看它是否与条件匹配.如果存在很高的可能性,那么如果查询优化器足够复杂,则可以避免数据的完全扫描和排序. 在许多情况下,如果找到匹配记录和基于索引的访问权限很少,那么您会发现这个区别是微不足道的(您的示例中的“电子邮件”中有唯一的索引).但是,即使如此,我仍然会优先使用“take”. 编辑:我只是添加,虽然它有点偏离主题,在你的例子中,你可以使用: User.find_by(email: 'f@example.com') 生成的查询应该与采取完全相同,但是语义有点更清楚. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |