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的未来.
让我们知道你是如何得到的......一切顺利.
你写了:
但是当我通过迁移将它们添加到我的数据库时,它只需要几秒钟来添加它们.出于某种原因,我认为他们必须经历我的所有条目(其中有数千条)并将它们编入索引.
索引不会花费很长时间,除非你有数百万条记录.数据库索引只是一种排序,并且可以在以后使用.
您的索引应用于新记录和现有记录.
UPDATE
最大的收获:
Memcache很不错,但是你的应用程序很复杂,在你的应用程序被数据库读取绑定之前,你通常不会得到提升.