【问题标题】:Which one is best for performance from 'order' and 'sort_by'?哪一个最适合“order”和“sort_by”的性能?
【发布时间】:2016-10-18 10:02:25
【问题描述】:

哪一个最适合性能?

1) 订单(数据库端计算)

2) sort_by(Ruby 端计算)

根据我的想法,sort_by 应该比order 快。因为order 是从数据库端执行的,所以它比较慢,sort_by 在得到结果后在 ruby​​ 端执行,但是看到这个结果我很困惑。

=> 普通查询(比ordersort_by 查询花费更多时间):-

> User.all
SELECT "users".* FROM "users"
#<Benchmark::Tms:0x000000089e4398 @cstime=0.0, @cutime=0.0, @label="", @real=6.515499990200624e-05, @stime=0.0, @total=0.0, @utime=0.0>

=> 使用带有基准的order 进行查询(比普通查询和sort_by 查询花费更少的时间):-

> User.order(:name)  # `order` query is perform in sql so should take more time
User Load (0.6ms)  SELECT "users".* FROM "users"   ORDER BY "users"."name" ASC
#<Benchmark::Tms:0x00000007ec48c8 @cstime=0.0, @cutime=0.0, @label="", @real=0.00014305600052466616, @stime=0.0, @total=0.0, @utime=0.0>

=> 使用带有基准的sort_by 进行查询(比order 查询多,比普通查询花更少的时间):-

> User.all.sort_by(&:name) # Not perform `order` from database side so should be faster then `order`
SELECT "users".* FROM "users"
#<Benchmark::Tms:0x0000000897e5c0 @cstime=0.0, @cutime=0.0, @label="", @real=0.0019228710007155314, @stime=0.0, @total=0.0, @utime=0.0>

结论:-

普通查询实时:- 6.515499990200624e-05

order实时查询:- 0.00014305600052466616

sort_by实时查询:- 0.0019228710007155314

从这个结论我们可以说:-

普通查询然后应用order查询需要太多时间。

我们必须使用order 方法来减少查询执行时间?

根据我的想法,我总是更喜欢sort_by

哪个是最好的:(

【问题讨论】:

  • 为什么你认为数据库比 Ruby
  • 这就像神话一样,尽可能少地从数据库端执行计算以提高性能。从语言方面执行大多数计算,如 ruby​​ , php 以获得更好的性能。
  • 优化的数据库查询几乎总是比应用程序计算快。您对 PHP 与 Ruby 的选择在这里也可能无关紧要(我们可以停止延续 ruby == 慢 的寓言吗?)—— any 应用程序中处理的关键问题语言是内存消耗。
  • 我们的users 表有多少条目?提示:基准通常对于少量且没有重复的情况没有多大意义。我建议
  • 6.515e-05 小于 0.000143,而不是更多——这是您分析中相当基本的错误。

标签: ruby-on-rails ruby postgresql ruby-on-rails-4 activerecord


【解决方案1】:

数据库处理速度比 Ruby 快几个数量级。并且数据库处理完全可以很好地扩展,而 Ruby 的处理速度下降与您正在处理的数据大小的增加成正比。

使用 Ruby 进行处理会大大增加时间和(尤其是)内存消耗,并且它很容易使内存过载并且 永远无法真正完成拥有数据集的处理是“大”。

使用 Ruby 进行 1_000_000 行的一些计算需要 几十 秒,而 PostgreSQL 会在 秒内完成强>秒。

【讨论】:

  • 对,在数据库中排序应该更快。上面发布的基准可能是异常的。考虑到 Rails 的预热时间,您可能需要多次执行基准测试。另外,如果您想在 Ruby 中以简单的方式执行此操作,请查看 benchmark-ips
  • 并且您可以通过添加适当的索引来进一步提高数据库查询的性能。
【解决方案2】:

您的第一个假设应该始终是数据库中的数据操作将比在 Ruby 中快得多。

对于个问题子集,您可以选择不使用数据库。

例如,如果您有一条包含多个子记录的记录,并且您必须根据各种条件(活动 = 真、日期

但是,这不应该是您的第一个假设。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多