kavo’s diary

備忘録

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
    • Comment

ので、Postの取得とCommentの取得は別SQLで実行する。

デバッグ

  • SQLレベル:mysqlコンソールで直打ち
  • Goレベル:

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);