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

ruby-on-rails – .exists之间的性能差异?和.where.present?

发布时间:2020-12-17 02:48:28 所属栏目:百科 来源:网络整理
导读:以下两个选项之间存在哪些性能差异( mentioned in this answer) Thing.where(name: "Bob").present? 它产生SQL SELECT COUNT(*) FROM things WHERE things.name = "Bob"; 和 Thing.exists?(name: "Bob") 它产生SQL SELECT 1 AS one from things WHERE name =
以下两个选项之间存在哪些性能差异( mentioned in this answer)

Thing.where(name: "Bob").present?

它产生SQL

SELECT COUNT(*) FROM things WHERE things.name = "Bob";

Thing.exists?(name: "Bob")

它产生SQL

SELECT 1 AS one from things WHERE name ="Bob" limit 1;

由于SQL语句不同,理论上可能存在性能差异.但我不知道,假设名称已在数据库中编入索引,是否存在任何实际差异.此外,在Ruby-land中完成的工作量(例如初始化和GC)是否有任何差异.

如果它有任何区别,我正在使用Rails 3.2.20.

解决方法

您可以像这样自己做基准测试:

$bin/rails c
> ids = Item::Project.pluck(:id)
> b = Benchmark.bmbm do |x|
>   x.report("present?") { 10000.times { Item::Project.where(id: ids.sample).present? } }
>   x.report("exist?") { 10000.times { Item::Project.exists?(id: ids.sample) } }
> end
> puts b
  4.650000   0.270000   4.920000 (  7.627897)
  4.660000   0.330000   4.990000 (  7.337031)

id由数据库索引.如果我选择一个未编制索引的列,结果如下所示:

12.590000   0.740000  13.330000 ( 71.199677)
   8.350000   0.620000   8.970000 ( 34.846301)

此表有大约30000条记录.那么礼物?比存在慢?因为它必须先计算所有匹配的记录.

(编辑:李大同)

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

    推荐文章
      热点阅读