我已经构建 rails 应用程序一段时间了,但不幸的是,我的应用程序都没有大量的数据或流量。 但现在我有一个正在获得动力。 因此,我首先致力于扩展和优化我的应用程序。
似乎这样做的第一步也是最简单的步骤是使用数据库索引。 我有一个庞大的索引列表,应该涵盖几乎所有的查询,但是当我通过迁移将它们添加到我的数据库中时,只需几秒钟即可添加它们。 出于某种原因,我认为他们必须遍历我的所有条目(其中有数千个)并索引它们。
这是否意味着我的索引尚未应用于现有数据?它们只会添加到新条目中吗?
此外,我正在研究其他扩展解决方案,例如 memcached,以及围绕精简我的查询等。
如果有人能指出我一些优化我的 rails 3 应用程序的好资源,我将不胜感激!
谢谢!
编辑:
感谢所有关于数据库索引的精彩答案!在优化和扩展我的应用方面,我还应该考虑什么?内存缓存?在优化方面,最佳性能提升/工作量比是多少?
索引添加到您的所有ID和您在更多情况下"find_by"的数据中总是一个好主意,例如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有一个真正的教程视频,这对我来说是一个很好的见解,非常值得你花费12美元和37分钟的时间。有像MetaWhere这样的宝石,也可以为您提供帮助。
最重要的是,在 Rails 3 及更高版本中,是 ActiveRelations。这是仅在需要时执行查询的地方。例如,您可以调用User.scoped,而不是关闭User.all,当视图中的迭代发生时,SQL将执行。强大的东西和Rails的未来。
让我们知道您如何相处...万事如意。
你写道:
但是当我通过迁移将它们添加到我的数据库中时,只需几秒钟即可添加它们。出于某种原因,我认为他们必须遍历我的所有条目(其中有数千个)并索引它们。
除非您有数百万条记录,否则索引不会花费很长时间。数据库索引只是一种排序,记录该排序以供以后使用。
您的索引同时应用于新记录和现有记录。
更新
物超所值:
- 将长时间运行的进程移动到delayed_job(或类似进程)
- 摆脱 n+1 个查询
Memcache 很好,但会使您的应用程序复杂化,并且您通常不会获得提升,直到您的应用程序被数据库读取绑定。