我的一位朋友让我查看他的网站,看看哪里出错了。有些东西花了很长时间(所以nginx返回502错误)。花了一些时间调试后,我发现了这个:
User.all.take(10)
我以前检查了回购,我在本地运行它,一切正常。问题是:他喜欢10m的用户,并且该查询将所有用户加载到内存中(而不是在数据库上进行分页)。
在修复某些内容之后,通常应该编写一个联合测试来确保错误不再出现。现在,我的问题是:
我怎样才能确保这样的事情不再发生?
答案 0 :(得分:0)
如果您在function relativeComplement ( setB, cmp ) {
var sharedSetB = setB.shareReplay();
return function ( setA ) {
return Rx.Observable.forkJoin(setA.toArray(), sharedSetB.toArray(), function ( arrayA, arrayB ) {
return relativeComplementArray(arrayA, arrayB, cmp);
})
}
}
之前使用Rails
版本,则4.0.2
方法的行为可能略有不同,因为take
方法为not yet introduced take
ActiveRecord::Relation
1}}。
它在4.0.2之前的行为方式是获取整个User.all
数组并运行Ruby数组take
方法从数组中获取10个元素,这些元素效率很低并导致{{1} }}。它会生成以下查询。
Bad Gateway
SELECT "users".* FROM "users"
中引入的新take方法更像是Rails 4.0.2
方法的别名。它将生成以下查询
limit
因此,对于较旧的Rails版本,只需使用SELECT "users".* FROM "users" LIMIT 10
方法
limit
P.S。我假设您使用的是较旧的rails版本,因为这是对行为发生的最合乎逻辑的解释。此外,您的网站有1000万用户,所以它必须已经很长时间了。祝你好运。
答案 1 :(得分:0)
I recommend the gem, bullet.
https://github.com/flyerhzm/bullet
It helps to detect inefficient queries like N+1 query. It simply alerts on a browser when opening the page that calls such query.
And there are some configurations, please see:
https://github.com/flyerhzm/bullet#configuration
Hope it helps!