どうも、三町哲平です。
Ruby on Railsでアプリ作成もいよいよ大詰め。おおよその機能が完成したところで次に気にするのは、どこでしょうか?
私は、真っ先にユーザビリティ(Webサイトやソフトウェアなどの操作性)をもっと突き詰めたいと思う様になりました。しかもDBのデータを一覧表示するときだけ、処理が遅くない?と思いログを見ていたのですが、
なんか青文字がいっぱいじゃないですか!?
色々調べてみるとどうもN+1問題というものが絡んでいそうなので、その辺りを今回はまとめてみました!
Nプラス1問題とは?
「データベースからデータを取り出す際に、SQLの発行を必要以上に行ってしまう問題のこと」です。
このSQLの発行が必要以上行われることにより、処理に時間が掛かりページ遷移が遅くなってしまうという現象が起こります。
※__SQL__とは、データベース言語でDBへの更新、追加、削除などを行う事ができます。しかし、Railsの場合だとActiveRecordのおかげで直接データベース言語を書かなくてもDBへの更新、追加、削除などを行う事ができます。
※__ActiveRecord__とは、Ruby on Railsで使用しているO/Rマッパーのことです。
O/Rマッピングとは、オブジェクト指向プログラミング言語におけるオブジェクトとリレーショナルデータベース(RDB)の間でデータ形式の相互変換を行うこと。そのための機能やソフトウェアを「O/Rマッパー」(O/R mapper)という。
引用記事:O/Rマッピング(O/Rマッパー)とは - IT用語辞典 e-Words
用語を理解した上で
N+1問題で頻出する用語が分かった後は、大変分かりやすくまとめられている記事がいくつもございますで、こちらを参考にして解決していきましょう!
私が学習の際に利用したページのリンクを載せます。
動画で理解する
記事で理解する
- N+1問題 - Qiita
- [解説] SQLクエリのN+1問題 - Qiita
- N+1問題は1+N問題 - Qiita
- 【Rails】パフォーマンス低下に繋がるN+1問題とは?解決策と併せて解説!|TechTechMedia
- 【Rails】N+1問題って何?原因と対処法を徹底解説! | Pikawaka - ピカ1わかりやすいプログラミング用語サイト
- N+1問題におけるORMの重たさについて - Atsuo Ishimoto's blog
- 【Ruby on Rails】N+1問題ってなんだ? - Qiita
それでもやっぱり難しい方へ
Railsには、bulletという便利なgemが存在します。
N+1問題が発生している際に下図の様な警告文が出るのでその通りにcontrollerもしくは、viewを修正してやれば解決します。
※bulletについての詳しい使用方法は、下記リンクを参考にして下さい。
- 【Rails】N+1問題をアラート表示してくれるgem「bullet」が超絶便利だった!|TechTechMedia
- Railsライブラリ紹介: N+1問題を検出する「bullet」 | TECHSCORE BLOG
- 【初心者】N+1問題を発見!Bulletの使い方 - Qiita
今回の記事は、短いですが以上です!!