【问题标题】:Rails 3 Database Indexes and other OptimizationRails 3 数据库索引和其他优化
【发布时间】:2011-08-30 13:11:33
【问题描述】:

我一直在构建 Rails 应用程序,但不幸的是,我的应用程序都没有大量数据或流量。但现在我有一个正在获得动力。因此,我首先深入研究扩展和优化我的应用程序。

似乎第一步也是最简单的一步是使用数据库索引。我有一个很好的索引列表,应该涵盖了我几乎所有的查询,但是当我通过迁移将它们添加到我的数据库时,只需要几秒钟就可以添加它们。出于某种原因,我认为他们必须检查我所有的条目(其中有数千个)并将它们编入索引。

这是否意味着我的索引尚未应用于我已经存在的数据?它们只会被添加到新条目中吗?

此外,我正在研究其他扩展解决方案,例如 memcached,以及所有关于精简我的查询等。

如果有人能指出一些用于优化我的 rails 3 应用程序的好资源,我将不胜感激!

谢谢!

编辑:

感谢所有关于数据库索引的精彩回答!在优化和扩展我的应用程序方面,我还应该注意什么?内存缓存?就优化而言,什么具有最佳的性能提升/努力比?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 optimization indexing query-optimization


    【解决方案1】:

    你写道:

    但是当我通过迁移将它们添加到我的数据库时,只需几秒钟即可添加它们。出于某种原因,我认为他们必须检查我所有的条目(其中有数千个)并将它们编入索引。

    除非您拥有数百万条记录,否则索引不会花费很长时间。数据库索引只是一种排序,并记录该排序以供以后使用。

    您的索引同时应用于新记录和现有记录。

    更新

    物超所值:

    1. 将长时间运行的进程移至delayed_job(或类似的)
    2. 摆脱 n+1 查询

    Memcache 不错,但会使您的应用程序复杂化,并且您通常在应用程序被数据库读取绑定之前无法获得提升。

    【讨论】:

    • 另外结帐sidekiqdelayed_jobs 的相对更好的替代品(更高效等),并且正在不断开发中。
    • 同意@Ameen --- sidekiq 无疑是当今最好的选择,其次是 Resque。 (我最初的回答是 2011 年 5 月——从那以后情况肯定发生了变化)
    【解决方案2】:

    将索引添加到您“find_by”多次的所有 ID 和数据中总是一个好主意,例如电子邮件地址。同样,您可以放心地假设 ID 永远不会变为负数,因此从长远来看,将 ID 列设为 Unsigned 将受益。与任何 DBA(数据库管理员)交谈,他们会多次告诉您这样做。

    目前,您的所有 ID 列很可能都有类似的内容...

    t.integer :column_name, :null => false
    

    或者...

    t.references :column_name, :null => false
    

    只需将其更改为...

    t.column :column_name, 'integer unsigned', :null => false
    

    你会看到一个微小的增长。

    索引很简单...

    add_index :reviews, [:column_id, :column_type] # Polymorphic
    add_index :reviews, :column_id # Standard
    

    Rails API 应该为您提供所有您需要知道的信息。

    Peepcode 有一个真正得到的tutorial video,这对我来说是一个很好的洞察力,非常值得你花 12 美元和 37 分钟的时间。有像 MetaWhere 这样的 Gems 也可以帮助你。

    最重要的是,在 Rails 3 及更高版本中,是 ActiveRelations。这是仅在需要时才执行查询的地方。例如,您可以调用 User.scoped 而不是关闭 User.all,当视图中的迭代发生时,执行 SQL。强大的东西和 Rails 的未来。

    让我们知道您的进展情况……一切顺利。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-14
      • 2014-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多