ISUCON練習 private-isu[4] ~16275点 アプリ書き換え時デバッグ、getIndex・getAccountNameのN+1解消
getIndexの改善
引き続き無駄な部分を改善する。
- コメントは3個まででよい
- UserのデータはAccountNameだけしか使ってないと思われる
GitHub - jmoiron/sqlx: general purpose extensions to golang's database/sql
sqlxは多分、フィールドの配列構造体を直接SQL結果からバインドできない・・・と思う。
- Post
ので、Postの取得とCommentの取得は別SQLで実行する。
デバッグ
post取得部分
SQL
今のpost取得SQL
ポストのユーザとコメント数をくっつけたもの
Go
{ "version": "0.2.0", "configurations": [ { "name": "Launch Go App", "type": "go", "request": "launch", "mode": "debug", "program": "${workspaceFolder}/app.go", "env": { "ISUCONP_DB_HOST": "localhost", "ISUCONP_DB_PORT": "3306", "ISUCONP_DB_USER": "root", "ISUCONP_DB_PASSWORD": "root", "ISUCONP_DB_NAME": "isuconp", "ISUCONP_MEMCACHED_ADDRESS": "memcached:11211" } } ] }
vscodeでデバッグ起動。dockerのmysqlに接続。
docker compose build app && docker compose up -d --force-recreate app
{"pass":true,"score":15863,"success":12204,"fail":0,"messages":}
GET /が0.004secまで行った。
getAccountName
次はURI実行時間が1位になったgetAccountNameを見る。AVGが0.030。
処理を読むとgetIndexと同様のmakePostsを使っていたのでN+1を解消。
{"pass":true,"score":16275,"success":12514,"fail":0,"messages":}
これでgetAccountNameのAVGが0.018になった。
インデックスも改善できるかと思ったが、逆にスコア8000くらいに減ってしまったので取り消し。
CREATE INDEX idx_posts_created_at_user_id ON posts (user_id, created_at desc);