karszawa / sign-of-horns

ISUCON 7 Qual Repository :metal:
0 stars 1 forks source link

N+1クエリの改善 #4

Open karszawa opened 7 years ago

karszawa commented 7 years ago

なにをやるか

なぜやるか

劇的な改善が見込めるから

どうやるか

ORM依存が大きいと思う。 過去問では標準ライブラリの "database/sql" が使われることが多いのでこれを仮定する。

belongs to な関係

row := db.QueryRow(`SELECT * FROM users WHERE id = ?`, userID)
model := Model
row.Scan(&model.ID, &model.Name, &model.RelatedAttribute)

// 複数行のときはNextを使う
for rows.Next() {
  ...
}

has many な関係

親のIDをセレクト後にそれをin句に指定して子をセレクトし、それをマップにするのが良いと思う。

m := map[int][]string{}

ary, ok := m[1]

if ok {
    m[1] = append(ary, "val-1")
} else {
    m[1] =  []string{"val-1"}
}

ary, ok = m[1]

if ok {
    m[1] = append(ary, "val-2")
} else {
    m[1] = []string{"val-2"}
}