ISUCON10 予選参加 (24位 team😇😇😇)
ISUCON10の予選にteam😇😇😇で参加しました.
結果は24位で通過です.めでたい
やったこと
計測
- new relic
- どのrequestが遅いとか,sqlが何回何秒かかってるかわかって便利だった.
- sql slow log
- indexが効いてないクエリがたくさん確認できた
- utgwがforce indexでちまちまindexを適用していた
- access log
- utgwがsearch系の検索クエリの種類の統計をとってくれた
- featuresは2-3回しかクエリが飛んでこないので無視でOK
運用
- 1台go 2台mysqlで実装
- 独立したmysqlで両方に同じinsertをした.
- 乱数ラウンドロビンでselectを分散した.
その他色々チューニングをnonyleneがしてくれた.
chairとestateの垂直分割が正着っぽい‥
N+1改善
- nazotteの多角形内部の座標にあるestateをselectがN+1だった
- 多角形内部の判定をする前に,凸包する矩形で多めにestateをとってきて, 一つ一つ内側か判定していた.
- 単に一つのクエリにまとめることができる.
- 10倍ぐらい速くなって,少なくともボトルネックではなくなった.
https://github.com/innocent-team/isucon10q/commit/051ece1bb50e3b23c4ae2f49de9c2f75bc8e7f4f (そのうち公開)
SELECT * FROM estate WHERE latitude <= ? AND latitude >= ? AND longitude <= ? AND longitude >= ? AND ST_Contains(ST_PolygonFromText(?), POINT(latitude, longitude)) ORDER BY popularity DESC, id ASC LIMIT ?
できなかったこと
- low_pricedのキャッシュを実装したが,効果がなくrevert.
- 唯一のupdate要素のchair.stockをDBから引き剥がす実装もしたが,こっちはfailedしたの諦め.