任何曾与Rails对于任何大量的时间可能知道Rails性能往往是紧密耦合的数据库查询性能。出于这个原因,是极具价值的和你当地的交朋友慢速查询日志,你可以确定最长的查询,需要调优。所以,一旦你确定了你慢查询(ies),是时候得到优化,对吧?没有那么快。首先你需要找出来在代码中这个查询的方法是生成。如果你做的事情Rails的方式和使用ActiveRecord生成这些查询,可以很艰难,因为你不能只是grep发现查询的代码。
输入查询日志标记
Rails 7添加一个惊人的新功能,查询日志标记。这一特性,当打开(默认是关闭),将评论添加到年底每个查询显示一些上下文帮助你追踪,查询是从哪里来的。
——从my_table_with_bajillions_of_records SELECT *之前;——从my_table_with_bajillions_of_records SELECT *后;/ *应用:MyApp,控制器:my_controller行动:my_action * /
这可以节省很多时间,试图找出什么是生成一个特别慢查询。打开它,你只需要添加以下配置/ application.rb:
config.active_record。query_log_tags_enabled = true
像往常一样Rails有理智的违约的。所以你会得到以下自动上下文在每个查询:
- 应用程序名称
- 控制器名称
- 控制器动作
- ActiveJob类
对于大多数应用程序来说,这是你所需要的。然而,我们注意到,我们的一些最查询包括在评论,只有应用程序名称如下:
从my_table_with_bajillions_of_records SELECT *;/ *应用:MyApp * /
好了,欣赏,Rails。很确定我已经知道查询来自我的程序,但由于。
那么问题是什么呢?为什么我们没有获得更多在这些查询上下文?
Sidekiq
我们的忠实粉丝Sidekiq在BetterUp。事实上,我们喜欢它,我们用很多的企业和专业功能。现在,为了使用一些更高级的功能(如大部分排队你需要使用Sidekiq::工作直接API,而不是通过Rails ActiveJob抽象。这是好,但也许你会看到这是:因为我们没有使用ActiveJob,我们没有得到那份工作名称自动查询日志中的标签。
那么,我们如何解决呢?ActiveSupport这样::ExecutionContext救援!事实证明,我们可以把任何我们想要的执行上下文,然后配置查询日志标记包括那件事在我们的查询。我们生了一个非常简单的Sidekiq中间件看起来像这样:
模块SidekiqMiddleware类ActiveSupportExecutionContext def调用(_worker_class、工作、_queue &) #如果设置了“包装”,这是一个“ActiveJob”已在执行上下文(“包装”).present sidekiq_job_class =工作?吗?零:工作(类的)。to_s ActiveSupport这样::ExecutionContext。集(sidekiq_job_class: sidekiq_job_class &)端端端
然后我们添加以下配置/ application.rb:
config.active_record。query_log_tags < <: sidekiq_job_class
和大作。现在我们有Sidekiq工作类的名字在我们查询!
从my_table_with_bajillions_of_records SELECT *;/ *应用:MyApp, sidekiq_job_class: MySidekiqJob * /
关于作者
布莱恩2017年加入BetterUp作为一个完整的堆栈高级工程师。他住在明尼阿波利斯地区与他的妻子和两个儿子。布莱恩是一个热爱家庭时间,徒步旅行、骑自行车、视频游戏、和串行优化。

加入谈话