20

我一直在构建rails应用程序一段时间,但不幸的是,对于我来说,我的应用程序都没有大量的数据或流量。但现在我有一个正在蒸蒸日上的。因此,我首先想到扩展和优化我的应用程序。Rails 3数据库索引和其他优化

看起来第一个也是最简单的一步就是使用数据库索引。我有一个很好的索引列表,应该涵盖几乎所有的查询,但是当我通过迁移将它们添加到我的数据库时,只需要几秒钟就可以添加它们。出于某种原因,我认为他们将不得不通过我的所有参赛作品(其中有成千上万)并为它们编制索引。

这是否表示我的索引还没有应用于我现有的数据?他们只会被添加到新的条目?

此外,我期待到其他缩放解决方案,如memcached的,和周围减磅我查询等

如果任何人都可以点我一些很好的资源优化我的Rails应用程序3我将不胜欣赏它!

谢谢!

编辑:

感谢所有关于数据库索引伟大的答案!我还应该考虑优化和缩放我的应用程序? Memcached的?在优化方面什么具有最佳性能提升/努力比率?

回答

22

在一些场合,例如,在所有ID和数据上添加索引总是一个好主意。电子邮件地址。同样,您可以安全地假设ID永远不会变为负数,因此使ID列Unsigned将从长远来看受益。与任何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有一个真正的tutorial video这是一个伟大的洞察力,我非常值得的12美元和37分钟的时间。有像MetaWhere这些宝石可能会帮助你。

最重要的是,在Rails 3及以上的版本中,ActiveRelations是ActiveRelations的一部分。这是只在需要时执行查询的地方。例如,关闭User.all,您可以调用User.scoped,并且View中的迭代发生在执行中的SQL时。强大的东西和Rails的未来。

让我们知道你如何继续...一切顺利。

8

您写道:

,但是当我通过迁移将它们添加到我的数据库只用了几秒钟就可以添加。出于某种原因,我认为他们将不得不通过我的所有参赛作品(其中有成千上万)并为它们编制索引。

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

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

UPDATE

为您的降压

最大的爆炸:

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

Memcache的是不错,但是会让你的应用程序变得复杂,并且在你的应用程序被数据库读取绑定之前,你通常不会获得提升。

+1

还检出'sidekiq'一个相对较好的选择(更高效等)到'delayed_jobs'并且不断开发。 – Ameen 2013-10-09 08:24:56

+0

同意@Ameen --- sidekiq今天是最好的选择,Resque秒。 (我原来的回答是2011年5月 - 事情自那时起就发生了变化) – 2013-10-09 17:32:38