保华的Rails学习笔记

后端性能优化学习

一个网站,在后端方面,90%的机率是慢在数据库的操作的,10%是慢在ruby code代码,
所以我们在优化后端性能的时候,可以着重优化关于数据库的操作

我们可以从以下方面入手:
检测网站加载时间可以用:Rails 里面的测速神器:https://github.com/MiniProfiler/rack-mini-profiler

1、消灭N+1 Query

例如我们访问:


查服务器的logs信息,可以看到:

它执行了4次查询,即N+1 Query,第一个是查询groups的,后三个都是查询user表的,
如果网页数据比较多,会执行很多次查询,会大大的拖慢网站的加载速度,这时候我们可以用
includes(:class)的方式来解决N+1 Query的问题
例如在groups_controller中的

@groups = Group.all可以改为@groups = Group.includes(:user).all

这样在查询每个group的user时,执行一次sql查询就可以了

def index
    @groups = Group.includes(:user).all
  end

再找logs信息


这里它把查询user合并为查询一次了

2、消灭Table Scan

Table Scan 的意思是一般数据库,在没有加 Index (索引)的情况下,找资料是一笔一笔的循序的找
这样查询效率非常低,解决办法是
为某些经常查询的栏位,加上索引
加索引是新增一个 migration 然后打上 Index,例如

def change
   add_index :orders, :user_id
end

同样,我们也可以给布尔类型的栏位加索引,给日期栏位加索引,还可以给 state_machine 的条件加索引
索引的建立也是有效率区别的,它们按照索引效率高低分为:
boolean > integer > string > date > datetime

3、使用 counter cache

我们在查询资料有多少笔时,例如group.posts.count时,发现logs信息是执行了select count()这样的命令,
其实count(
)挺伤效能的
解决办法就是用counter cache,它的实现方法是为has_many的一方添加一个栏位(例如给group添加posts_count栏位)
然后在belogs_to的一方model中添加上counter_cache: true

4、用工具自动侦测 N+1 Query, Counter Cache

Bullet,参考地址: https://github.com/flyerhzm/bullet很好用的工具,我上一篇写过,这里不再赘述