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
最大的收获:
- 将长时间运行的进程移至delayed_job(或类似)
- 摆脱n + 1个查询
Memcache很不错,但是你的应用程序很复杂,在你的应用程序被数据库读取绑定之前,你通常不会得到提升。