Slide 60
Slide 60 text
[グループ] private-isu
の N+1 を探せ! (5 分)
alp
の結果で遅かった /
(トップページ) の処理を見てみましょう。
ソースコードは /home/isucon/private_isu/webapp/golang/app.go or
python/app.py
にあります。
// /home/isucon/private_isu/webapp/golang/app.go
// トップページのハンドラー
func getIndex(w http.ResponseWriter, r *http.Request) {
// 投稿を取得
results := []Post{}
err := db.Select(&results, "SELECT * FROM `posts` ORDER BY `created_at` DESC LIMIT ?", postsPerPage)
for i := 0; i < len(results); i++ {
// この中で何をしている?
err := db.Get(&results[i].User, "SELECT * FROM `users` WHERE `id` = ?", results[i].UserID)
// コメント数を取得
var count int
db.Get(&count, "SELECT COUNT(*) FROM `comments` WHERE `post_id` = ?", results[i].ID)
results[i].CommentCount = count
// コメントを取得
comments := []Comment{}
db.Select(&comments, "SELECT * FROM `comments` WHERE `post_id` = ? ORDER BY `created_at` DESC LIMIT 3", results[i].ID)
for j := 0; j < len(comments); j++ {
db.Get(&comments[j].User, "SELECT * FROM `users` WHERE `id` = ?", comments[j].UserID)
}
results[i].Comments = comments
60