  サインイン | 登録

  1. ホーム
  2. 
  3. プログラミング
  4. 
  5. Ruby on Rails
  6. 

Ruby on Railsのコードに潜むN+1クエリ問題をBullet gem で発見して、Railサイトのレスポンスを最適化

2020/07/03 更新 2020/07/22
Makio
サイトを運営していると、レスポンスを早くするにはどうすればいいかと常に考えますね。

サーバーの性能を上げたり、ネットワーク環境を良くしたりとハードウエアでの対応も重要ですが、実際に動いているコードの最適化が一番大切な所ですね。

123ishはRailsで出来ていますが、コードの最適化にBullet というジャムを使っています。


Rails の便利なオブジェクト関連性の定義によって、実は一つで済むようなSQL呼び出しが、関連するレコードをSQLから一つ一つ呼び出すという、とても時間のかかる実装に陥ってしまうことがあります。

一括読読み込みをすれば2回ですむSQL呼び出しが、そうでないと11回もSQL呼び出しをすることになってしまうという簡単な例と共に、このN+1クエリ問題についてRailsガイドに詳しく載っています。

このN+1クエリ問題を見つけてくれる便利なジャムがBullet です。


また、何時でも一括読み込みをすれば良いのでもなく、むしろ要らない読み込みはメモリーの浪費と逆にレスポンスを遅くしてしまいます。

この無駄な一括読み込みもBullet によってレポートされます。つまりBullet によって

  • N+1クエリ問題の発見
  • 無駄な一括読み込みの発見

が出来るのです。



Bulletジャムの導入方法


  1. BulletジャムをGemfile に記述
  2. 新しい環境ファイル optimization.rbの設定
  3. ジャムをoptimizationの時にのみ取り込み
  4. 実行

1. BulletジャムをGemfile に記述


2020年7月現在でバージョンは6.1.0でした。




2. 新し環境設定


Bulletを実行する環境を、optimizationとして普段使っているdevelopmentから分けます。development.rbをコピーしてobpimization.rbとしてconfig/environments に作り、以下のような設定を施します。




  • Bullet.enable = tureはBulletジャムを使って最適化を行うことを可能にします。
  • Bullet.alert = tureは問題点をjavascript のalertを使って表示することを可能とします。
  • Bullet.bullet_logger = trueはログをファイルにとっていくことを可能にします。ログはRails.root/log/bullet.logでとられます。
  • Bullet.console = trueはブラウザーのjavascript consoleにN+1問題を表示することを可能とします。
  • Bullet.rails_logger = trueはBulletジャムがRailsのログに記録することを可能とします。
  • Bullet.add_footer = trueは問題点をフッターに表示することを可能にします。

他の設定はBulletのオフィシャルサイトを参照にしてください。

おっと、webpacker.ymlにoptimizaionの環境を追加するのも忘れないでください。




3.optimization環境でBulletジャムを使います


Bulletジャムはoptimization環境で使います。




4.optimization環境でRailsを実行


実行する時にoptimization環境を読みます(デフォルトでは開発環境が使われますね)。


bundle exec rails server -e optimization


チェックするページに行くと、問題点があれば以下のイメージにあるように指摘してくれます。Bullet.alertとBullet.add_footerを2つともtrueにしているので、両方に表示されています



Bulletのメッセージの例


終わりに



N+1クエリも余分な一括読み込みも、どちらもレスポンスを非常に遅くしてしまいます。これを発見してくれるBulletジャムは、Railsのコードレベルでの最適化の強力な助っ人です。

よく注意しないと、N+1コードはいつの間にか入り込んでしまうし、更に余分な読み込みを書いてしまったりすることは頻繁にあることです。

でもBulletは、これらの問題を発見しコードの最適化を効率的に行うことを可能にしてくれます。


でも、Bulletがしてくれるのは問題点の発見であって、問題自体は解決はしてくれません!実際にコードの最適化をするのは開発者です。

123ishでは定期的にoptimizaion環境を使ってチェックを行っています。でも、立ち上がりが遅いので、普段は軽いdevelopment環境で開発しています。





#123ish, #ruby-on-rails, #Bullet, #Rails, #最適化, #N+1クエリ問題, #パフォーマンス
スコアー: 1.06
 コメント
 1 いいね
0
  信用しますか?  
0

    


NFT 123ish 3次元ゴールドコインアートコレクション




人気のコメント
最初にコメントする

ボード


サインインしてコメントを投稿する


Ruby on RailsでAMPページを作る方法

Ruby on Rails でDevise、ActiveModel::Otp、rqrcodeとグーグル認証システムによる二段階認証の実装の仕方

RailsアプリケーションでSporocketsからWebpackerへ移行する方法

Railsアプリケーションでのjquery-ujsからrails-ujsへの移行の仕方

Railsサイトで、friendly_id gemを使って日本語のフレンドリーURLを表示させる方法

知っているとお得な情報について書ける方を募集しています!

大籠のキリシタン〜東北のキリシタン殉教の地「大籠」、千松兄弟とは

大籠のキリシタン殉教と千松兄弟に託されたメッセージ

ぎっくり腰には、早めの非ステロイド性抗炎症薬の服用が回復に良いのでしょうか?

東北の隠れキリシタンの里大籠を、地元自治会作製の「キリシタン殉教とたたら製鉄の里大籠散策マップ」により紹介

グランド・ナレーティブ 大いなる物語 アメリカは何処に行くのだろうか?

政治的独立と信教の自由

地元観光地図よる生月のキリシタン巡礼地

【Webライティング・コンテンツ作製のコンペティション】第一回123ish杯 123ishでの投稿記事のコンペティション 🥇1位4万円 🥈2位2万円 🥉3位1万円

Upworkでの支払い、返金に関するトラブルはどう対応できるか?

プログラマーは簡単な英語の読み書きで、Upworkのフリーランスとしてより稼げるようになる

生月に永遠に刻まれたキリシタン信仰の壮絶なドラマ

信徒発見と信教の自由

アメリカでの日系老人介護施設費用

データサイエンティスト・データサイエンス職よりデータエンジニアでの転職の方が手堅い?未経験者がデータエンジニアになる方法を教えます。

有名ブログのUbersuggestによる月間オーガニックトラフィックでのランキングと分析

第一回123ish杯コンペティションの結果発表

【Webライティング・コンテンツ作製のコンペティション】第2回123ish杯 投稿記事コンペティション

未経験からデータサイエンティストとして転職を成功させる方法。データサイエンスでの華やかな道と手堅く成功させる道を教えます

国: 日本 (jp)
利用規約 | プライバシーポリシー | 私達に関して
よくある質問 | お問い合わせ
 
© 2025 123ish