gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 23:45:07 26 4
gpt4 key购买 nike

以下两个选项之间存在哪些性能差异(如果有) ( 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语句不同,理论上可能存在性能差异。但我不知道是否,假设 name在数据库中被索引,有任何实际区别。此外,在 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 条记录。所以 展示? 慢存在? 因为它必须首先计算所有匹配的记录。

关于ruby-on-rails - .exists 之间的性能差异?和.where.present?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30495637/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com