users {
id
profile {
name
}
}
N+1問題
– userを複数返却するQuery
– id fieldはusersテーブルから取得
– profileはprofilesテーブルから取得
# Ruby code
def resolve
User.all
end
Slide 5
Slide 5 text
users {
id
profile {
name
}
}
N+1問題
– usersは10件Hit
select * from users;
– profilesを1件ずつ取得 => N+1問題
select * from profiles where user_id = 1;
select * from profiles where user_id = 2;
…
select * from profiles where user_id = 10;
Slide 6
Slide 6 text
users {
id
profile {
name
}
}
N+1問題
– usersに対応するprofileを事前ロード
# Ruby code
def resolve
User.all.preload(:profile)
end
Slide 7
Slide 7 text
users {
id
profile {
name
}
}
N+1問題
– usersは10件Hit
select * from users;
– hitしたusersに対応したprofilesを事前ロード
select * from profiles
where user_id in (1, 2, …, 10);
Slide 8
Slide 8 text
users {
id
}
N+1問題
– usersは10件Hit
select * from users;
– fieldに指定していなくてもprofilesを事前ロー
ドしてしまう
select * from profiles
where user_id in (1, 2, …, 10);
Slide 9
Slide 9 text
users {
id
profile {
name
}
}
N+1問題
– usersに対応するprofileを遅延ロード
# Ruby code
def resolve
# fieldにprofileがある場合、profile
を取得するuser_idを記憶しておき、最後にま
とめて取得する
User.all
end