Rails: Bulletで検出されないN+1クエリを解消する

はじめに 普段、Railsを使って開発されている方であれば、関連するテーブルのデータを扱うときなど、N+1クエリを発行していないか、気をつけているかと思います。 また、うっかりN+1クエリを発行してしまうことを防ぐため、N+1クエリを自動で検出するBulletというgemを導入しているかたも多いかと思います。ただ、Bulletで検出されないクエリでもN+1になっているケースがあります。 この記事ではBulletでは検出されないが、N+1になっているクエリを改善する方法を紹介します。 N+1問題とは N+1問題とは、1回のクエリで済むところをデータ量(N)の回数、クエリを発行してしまう問題のことです。 例えば以下のようなクエリはN+1クエリです。 Post Load (0.3ms) SELECT “posts”.* FROM “posts” ↳ app/views/posts/index.html.erb:14 Comment Load (0.4ms) SELECT “comments”.* FROM “comments” WHERE “comments”.”post_id” = ? [[“post_id”, 1]] ↳ app/views/posts/index.html.erb:17:in `map’ Comment Load (0.1ms) SELECT “comments”.* FROM “comments” WHERE “comments”.”post_id” = ? [[“post_id”, 2]] ↳ app/views/posts/index.html.erb:17:in `map’ Comment Load (0.1ms) SELECT “comments”.* FROM “comments” … Continue reading Rails: Bulletで検出されないN+1クエリを解消する