Rails 3数据库索引和其他优化

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

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

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

此外,我正在研究其他扩展解决方案,例如memcached,以及减少我的查询等等。

如果有人能指出一些优秀的资源来优化我的rails 3 app我会非常感激!

谢谢!

编辑:

感谢关于数据库索引的所有好答案! 在优化和扩展我的应用程序方面,我还应该注意什么? Memcached的? 在优化方面,最佳性能提升/努力比是多少?

将索引添加到您’find_by’的所有ID和数据总是一个好主意,例如email_address。 同样,您可以安全地假设ID永远不会变为负数,因此从长远来看,使ID列无符号将受益。 与任何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有一个真正的教程video ,这对我来说是一个很好的见解,非常值得花费12美元和37分钟的时间。 像MetaWhere这样的Gems也可以为你提供帮助。

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

让我们知道你是如何进步的……一切顺利。

你写了:

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

索引不会花费很长时间,除非你有数百万条记录。 数据库索引只是一种排序,并且可以在以后使用。

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

UPDATE

最大的收获:

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

Memcache很不错,但是你的应用程序很复杂,在你的应用程序被数据库读取绑定之前,你通常不会得到提升。