第5回ISUCON勉強会
『Software Design 2021年7月号』を参考に、ISUCON10の「表示された地図をタッチして作った円の範囲中に物件があるかを検索する機能」(なぞって検索)のSQLを修正。修正する前は「座標の範囲に収まる物件を検索」→「検索した結果が正しく範囲に収まっているかを確認する(これがN+1)」となっている条件を、結合して1つのSQLに修正した。N+1とは、「N件のデータ行を持つテーブルをごそっと読みだすのに1回、別のテーブルから先述のテーブルの各行に紐づくデータを(1件ずつ)読み出すのに計N回、合計でN+1回のクエリを実行している状態」らしい(@muroya2355さんの記事参照)。
なぞって検索は、Python言語の場合app.pyファイル中の
@app.route("/api/estate/nazotte", methods=["POST"])
def post_estate_nazotte()
以下にある。この@マークはデコレータと言い、「ある関数を修飾するための関数とその仕組み」らしい(@mtb_betaさんの記事参照)。今の場合、app.route関数が後に続くpost_estate_nazotteを修飾している(関数の関数みたいな?)。
そして”POST”はHTTPのメソッドで、他の人に見られたくない情報を送る場合(パスワードなど)に使うらしい。見られてもいいのは”GET”で(@Sekky0905さんの記事参照)。HTTPについては『Webを支える技術 -HTTP、URI、HTML、そしてREST』という本が分かりやすいと師匠に聞いたので、いつか読もうと思う。
このpost_estate_nazotte関数の中で使われているST_Contains関数、ST_PolygonFromText関数、ST_GeomFromText関数は、MySQLでGISを扱える関数らしい(@onunuさんの記事参照)。よく分からなくてデバグが大変だったけど、最終的にISUCON公式Blogを参考に、
"SELECT * FROM estate"
" WHERE latitude <= %s AND latitude >= %s AND longitude <= %s AND longitude >= %s"
" ST_Contains(ST_PolygonFromText(%s), POINT(latitude, longitude))"
" ORDER BY popularity DESC, id ASC"
とすることで速くなった。う~ん。ST_GeomFromText関数どこ行ったんだ…。それにしても、Software Designの行間広すぎ~。
最近久しぶりに桃を食べた。美味しい。キウイを食べなかった娘も、この甘い桃は食べるだろうと思ったけど、あまり食べなかった。
そして今日は、昼食の後も元気で、結局17:00ぐらいに寝た。これ、夜どうやって寝るんだ…(´・ω・`)