sql – 在Ruby on Rails中采用vs第一个性能

前端之家收集整理的这篇文章主要介绍了sql – 在Ruby on Rails中采用vs第一个性能前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这是一个有关ActiveRecord查询方法的问题:

> first查找第一条记录(如果提供了参数,则为前N条记录).如果没有定义顺序,它将按主键排序.
>提供一个记录(或者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”将允许扫描被停止.
>需要排序多少行才能找到具有最低ID的行.最糟糕的情况是,表中的每一行都与标准匹配,需要包含在排序中.

还有一些其他因素需要考虑 – 例如对于“第一”查询,优化器可能能够通过扫描主键索引来访问表,并检查每一行以查看它是否与条件匹配.如果存在很高的可能性,那么如果查询优化器足够复杂,则可以避免数据的完全扫描和排序.

在许多情况下,如果找到匹配记录和基于索引的访问权限很少,那么您会发现这个区别是微不足道的(您的示例中的“电子邮件”中有唯一的索引).但是,即使如此,我仍然会优先使用“take”.

编辑:我只是添加,虽然它有点偏离主题,在你的例子中,你可以使用:

User.find_by(email: 'f@example.com')

生成查询应该与采取完全相同,但是语义有点更清楚.

猜你在找的MsSQL相关文章