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

god*_*yan 20 indexing optimization ruby-on-rails query-optimization ruby-on-rails-3

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

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

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

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

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

谢谢!

编辑:

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

Cha*_*rdy 22

将索引添加到您'find_by'的所有ID和数据总是一个好主意,例如email_address.同样,您可以安全地假设ID永远不会变为负数,因此从长远来看,使ID列无符号将受益.与任何DBA(数据库管理员)交谈,他们会多次告诉您这样做.

目前你很可能对你的所有ID列都有这样的东西......

t.integer :column_name, :null => false
Run Code Online (Sandbox Code Playgroud)

要么...

t.references :column_name, :null => false
Run Code Online (Sandbox Code Playgroud)

只需将其更改为......

t.column :column_name, 'integer unsigned', :null => false
Run Code Online (Sandbox Code Playgroud)

你会看到微小的增长.

索引很简单......

add_index :reviews, [:column_id, :column_type] # Polymorphic
add_index :reviews, :column_id # Standard
Run Code Online (Sandbox Code Playgroud)

Rails的API应该给你所有你需要知道的.

Peepcode有一个真正获得教程视频,这对我来说是一个很好的洞察力,非常值得花费12美元和37分钟的时间.像MetaWhere这样的Gems 也可以为你提供帮助.

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

让我们知道你是如何得到的......一切顺利.


Jes*_*ott 8

你写了:

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

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

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

UPDATE

最大的收获:

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

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