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条记录.那么礼物?比存在慢?因为它必须先计算所有匹配的记录. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |