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



我已经构建 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的未来。

让我们知道您如何相处...万事如意。

你写道:

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

除非您有数百万条记录,否则索引不会花费很长时间。数据库索引只是一种排序,记录该排序以供以后使用。

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

更新

物超所值:

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

Memcache 很好,但会使您的应用程序复杂化,并且您通常不会获得提升,直到您的应用程序被数据库读取绑定。

相关内容

  • 没有找到相关文章

最新更新