## mysql slow log
```
root@node1:/etc/nginx# mysqldumpslow -s t /var/log/mysql/mysql-slow.log
Reading mysql slow query log from /var/log/mysql/mysql-slow.log
Count: 502 Time=0.27s (134s) Lock=0.00s (0s) Rows=49.0 (24598), isucari[isucari]@localhost
SELECT * FROM items WHERE status IN
/* QUERY:getNewItems */
('S','S') AND (created_at < 'S' OR (created_at <= 'S' AND id < N))
ORDER BY created_at DESC, id DESC
LIMIT N
Count: 427 Time=0.26s (112s) Lock=0.00s (0s) Rows=49.0 (20923), isucari[isucari]@localhost
SELECT * FROM `items` WHERE `status` IN ('S','S') AND (`created_at` < 'S' OR (`created_at` <= 'S' AND `id` < N)) ORDER BY `created_at` DESC, `id` DESC LIMIT N
Count: 729 Time=0.14s (105s) Lock=0.00s (0s) Rows=28.1 (20499), isucari[isucari]@localhost
SELECT * FROM items
/* QUERY:getNewCategoryItems2 */
WHERE seller_id = N AND status IN ('S','S','S') ORDER BY created_at DESC, id DESC
LIMIT N
Count: 596 Time=0.16s (94s) Lock=0.00s (0s) Rows=28.2 (16807), isucari[isucari]@localhost
SELECT * FROM `items` WHERE `seller_id` = N AND `status` IN ('S','S','S') ORDER BY `created_at` DESC, `id` DESC LIMIT N
Count: 517 Time=0.15s (75s) Lock=0.00s (0s) Rows=33.0 (17042), isucari[isucari]@localhost
SELECT * FROM items
/* QUERY:getNewCategoryItems */
WHERE seller_id = N AND status IN ('S','S','S') AND (created_at < 'S' OR (created_at <= 'S' AND id < N)) ORDER BY created_at DESC, id DESC
LIMIT N
Count: 492 Time=0.14s (66s) Lock=0.00s (0s) Rows=8.8 (4341), isucari[isucari]@localhost
SELECT * FROM items
/* QUERY:getTransactions2 */
WHERE (seller_id = N OR buyer_id = N) AND status IN ('S','S','S','S','S') ORDER BY created_at DESC, id DESC
LIMIT N
Count: 432 Time=0.15s (64s) Lock=0.00s (0s) Rows=33.0 (14240), isucari[isucari]@localhost
SELECT * FROM `items` WHERE `seller_id` = N AND `status` IN ('S','S','S') AND (`created_at` < 'S' OR (`created_at` <= 'S' AND `id` < N)) ORDER BY `created_at` DESC, `id` DESC LIMIT N
Count: 264 Time=0.24s (63s) Lock=0.00s (0s) Rows=49.0 (12936), isucari[isucari]@localhost
SELECT * FROM `items` WHERE `status` IN ('S','S') AND category_id IN (N, N, N, N) AND (`created_at` < 'S' OR (`created_at` <= 'S' AND `id` < N)) ORDER BY `created_at` DESC, `id` DESC LIMIT N
Count: 303 Time=0.21s (62s) Lock=0.00s (0s) Rows=49.0 (14847), isucari[isucari]@localhost
SELECT * FROM items
/* QUERY:getNewCategoryItems2 */
WHERE status IN ('S','S') AND category_id IN (N, N, N, N) AND (created_at < 'S' OR (created_at <= 'S' AND id < N)) ORDER BY created_at DESC, id DESC
LIMIT N
Count: 412 Time=0.14s (55s) Lock=0.00s (0s) Rows=8.7 (3597), isucari[isucari]@localhost
SELECT * FROM `items` WHERE (`seller_id` = N OR `buyer_id` = N) AND `status` IN ('S','S','S','S','S') ORDER BY `created_at` DESC, `id` DESC LIMIT N
Count: 225 Time=0.21s (48s) Lock=0.00s (0s) Rows=49.0 (11025), isucari[isucari]@localhost
SELECT * FROM `items` WHERE `status` IN ('S','S') AND category_id IN (N, N, N, N, N, N) AND (`created_at` < 'S' OR (`created_at` <= 'S' AND `id` < N)) ORDER BY `created_at` DESC, `id` DESC LIMIT N
Count: 238 Time=0.16s (38s) Lock=0.00s (0s) Rows=49.0 (11662), isucari[isucari]@localhost
SELECT * FROM items
/* QUERY:getNewCategoryItems2 */
WHERE status IN ('S','S') AND category_id IN (N, N, N, N, N, N) AND (created_at < 'S' OR (created_at <= 'S' AND id < N)) ORDER BY created_at DESC, id DESC
LIMIT N
Count: 223 Time=0.13s (29s) Lock=0.00s (0s) Rows=11.0 (2453), isucari[isucari]@localhost
SELECT * FROM `items` WHERE (`seller_id` = N OR `buyer_id` = N) AND `status` IN ('S','S','S','S','S') AND (`created_at` < 'S' OR (`created_at` <= 'S' AND `id` < N)) ORDER BY `created_at` DESC, `id` DESC LIMIT N
Count: 238 Time=0.12s (27s) Lock=0.00s (0s) Rows=11.0 (2618), isucari[isucari]@localhost
SELECT * FROM items
/* QUERY:getTransactions */
WHERE (seller_id = N OR buyer_id = N) AND status IN ('S','S','S','S','S') AND (created_at < 'S' OR (created_at <= 'S' AND id < N)) ORDER BY created_at DESC, id DESC
LIMIT N
Count: 68 Time=0.15s (10s) Lock=0.00s (0s) Rows=49.0 (3332), isucari[isucari]@localhost
SELECT * FROM items WHERE status
/* QUERY:getNewItems2 */
IN ('S','S') ORDER BY created_at DESC, id DESC
LIMIT N
Count: 53 Time=0.16s (8s) Lock=0.00s (0s) Rows=49.0 (2597), isucari[isucari]@localhost
SELECT * FROM `items` WHERE `status` IN ('S','S') ORDER BY `created_at` DESC, `id` DESC LIMIT N
Count: 47 Time=0.18s (8s) Lock=0.00s (0s) Rows=49.0 (2303), isucari[isucari]@localhost
SELECT * FROM items
/* QUERY:getNewCategoryItems3 */
WHERE status IN ('S','S') AND category_id IN (N, N, N, N) ORDER BY created_at DESC, id DESC
LIMIT N
Count: 45 Time=0.16s (7s) Lock=0.00s (0s) Rows=49.0 (2205), isucari[isucari]@localhost
SELECT * FROM items
/* QUERY:getNewCategoryItems3 */
WHERE status IN ('S','S') AND category_id IN (N, N, N, N, N, N) ORDER BY created_at DESC, id DESC
LIMIT N
Count: 39 Time=0.18s (7s) Lock=0.00s (0s) Rows=49.0 (1911), isucari[isucari]@localhost
SELECT * FROM `items` WHERE `status` IN ('S','S') AND category_id IN (N, N, N, N) ORDER BY created_at DESC, id DESC LIMIT N
Count: 38 Time=0.18s (6s) Lock=0.00s (0s) Rows=49.0 (1862), isucari[isucari]@localhost
SELECT * FROM `items` WHERE `status` IN ('S','S') AND category_id IN (N, N, N, N, N, N) ORDER BY created_at DESC, id DESC LIMIT N
Count: 44 Time=0.00s (0s) Lock=0.00s (0s) Rows=5.2 (228), isucari[isucari]@localhost
SELECT id FROM categories
/* QUERY:getNewCategoryItems */
WHERE parent_id=N
Count: 9 Time=0.00s (0s) Lock=0.00s (0s) Rows=43.0 (387), isucari[isucari]@localhost
SELECT * FROM categories
/* QUERY:getSettings */
Count: 30 Time=0.00s (0s) Lock=0.00s (0s) Rows=5.1 (154), isucari[isucari]@localhost
SELECT id FROM `categories` WHERE parent_id=N
Count: 5 Time=0.00s (0s) Lock=0.00s (0s) Rows=43.0 (215), isucari[isucari]@localhost
SELECT * FROM `categories`
```
## クエリ統計
```
~/src/github.com/rhykw/isucon9 (master)> cat dump.log-1867| jq .query | grep 'QUERY:' | gsed -e 's/^.*QUERY:\([a-zA-Z0-9]*\) .*/\1/' | sort | uniq -c
1 getReports
52 getSettings
~/src/github.com/rhykw/isucon9 (master)> cat dump.log-1867| jq .stmt_prepare_query | grep 'QUERY:' | gsed -e 's/^.*QUERY:\([a-zA-Z0-9]*\) .*/\1/' | sort | uniq -c
79491 getCategoryByID
721 getConfigByName
1691 getItem
118 getItem2
118 getItem3
626 getNewCategoryItems
601 getNewCategoryItems2
74 getNewCategoryItems3
69 getNewItems
11 getNewItems2
25 getQRCode
22 getQRCode2
48 getTransactions
96 getTransactions2
1369 getTransactions3
559 getTransactions4
2066 getUser
33898 getUserSimpleByID
13 postBump
13 postBump2
13 postBump3
13 postBump4
13 postBump5
36 postBuy
27 postBuy2
26 postBuy3
27 postBuy4
22 postBuy5
17 postComplete
17 postComplete2
17 postComplete3
17 postComplete4
17 postComplete5
17 postComplete6
17 postComplete7
7 postItemEdit
7 postItemEdit2
3 postItemEdit3
3 postItemEdit4
60 postLogin
31 postSell
31 postSell2
31 postSell3
23 postShip
19 postShip2
19 postShip3
19 postShip4
19 postShip5
25 postShipDone
21 postShipDone2
21 postShipDone3
21 postShipDone4
18 postShipDone5
18 postShipDone6
```
## Goアプリ
```
root@iZ6we4a6fhkx178c26pna9Z:~# cat /etc/systemd/system/isucari.golang.service
[Unit]
Description = isucon9 qualifier main application in golang
[Service]
WorkingDirectory=/home/isucon/isucari/webapp/go/
EnvironmentFile=/home/isucon/env.sh
ExecStart = /home/isucon/isucari/webapp/go/isucari
Restart = always
Type = simple
User = isucon
Group = isucon
[Install]
WantedBy = multi-user.target
```
### エンドポイント
```golang
// API
mux.HandleFunc(pat.Post("/initialize"), postInitialize)
mux.HandleFunc(pat.Get("/new_items.json"), getNewItems)
mux.HandleFunc(pat.Get("/new_items/:root_category_id.json"), getNewCategoryItems)
mux.HandleFunc(pat.Get("/users/transactions.json"), getTransactions)
mux.HandleFunc(pat.Get("/users/:user_id.json"), getUserItems)
mux.HandleFunc(pat.Get("/items/:item_id.json"), getItem)
mux.HandleFunc(pat.Post("/items/edit"), postItemEdit)
mux.HandleFunc(pat.Post("/buy"), postBuy)
mux.HandleFunc(pat.Post("/sell"), postSell)
mux.HandleFunc(pat.Post("/ship"), postShip)
mux.HandleFunc(pat.Post("/ship_done"), postShipDone)
mux.HandleFunc(pat.Post("/complete"), postComplete)
mux.HandleFunc(pat.Get("/transactions/:transaction_evidence_id.png"), getQRCode)
mux.HandleFunc(pat.Post("/bump"), postBump)
mux.HandleFunc(pat.Get("/settings"), getSettings)
mux.HandleFunc(pat.Post("/login"), postLogin)
mux.HandleFunc(pat.Post("/register"), postRegister)
mux.HandleFunc(pat.Get("/reports.json"), getReports)
// Frontend
mux.HandleFunc(pat.Get("/"), getIndex)
mux.HandleFunc(pat.Get("/login"), getIndex)
mux.HandleFunc(pat.Get("/register"), getIndex)
mux.HandleFunc(pat.Get("/timeline"), getIndex)
mux.HandleFunc(pat.Get("/categories/:category_id/items"), getIndex)
mux.HandleFunc(pat.Get("/sell"), getIndex)
mux.HandleFunc(pat.Get("/items/:item_id"), getIndex)
mux.HandleFunc(pat.Get("/items/:item_id/edit"), getIndex)
mux.HandleFunc(pat.Get("/items/:item_id/buy"), getIndex)
mux.HandleFunc(pat.Get("/buy/complete"), getIndex)
mux.HandleFunc(pat.Get("/transactions/:transaction_id"), getIndex)
mux.HandleFunc(pat.Get("/users/:user_id"), getIndex)
mux.HandleFunc(pat.Get("/users/setting"), getIndex)
// Assets
mux.Handle(pat.Get("/*"), http.FileServer(http.Dir("../public")))
log.Fatal(http.ListenAndServe(":8000", mux))
```
### alp 統計
https://gist.github.com/rhykw/96be3eb4b10d34e0bb512a71792ce62b