加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 16:11:22 所属栏目:MsSql教程 来源:网络整理
导读:这是一个有关ActiveRecord查询方法的问题: first查找第一条记录(如果提供了参数,则为前N条记录).如果没有定义顺序,它将按主键排序. 提供一个记录(或者N个记录,如果提供一个参数)没有任何隐含的顺序.该顺序将取决于数据库的实现.如果提供订单,将被尊重. 用例
这是一个有关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')

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读