Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ランダム処理を修正し、DBの負荷を下げた話
Search
Keisuke Yamauchi
April 12, 2024
0
24
ランダム処理を修正し、DBの負荷を下げた話
Keisuke Yamauchi
April 12, 2024
Tweet
Share
More Decks by Keisuke Yamauchi
See All by Keisuke Yamauchi
動的型付け言語に抗うPHPStanという戦士
kechiiin
0
13
Cake.jpのCRM 今と未来
kechiiin
0
32
半年かけてPHP5.6からPHP7.4までバージョンアップした苦労と工夫 PHPカンファレンス福岡2024
kechiiin
1
490
(弊社の)OpenSearchに潜んでいた罠
kechiiin
0
90
before/afterで見る Cake.jpのアジャイル開発
kechiiin
0
14
レガシーからモダンへ? PHP5.6からの脱却
kechiiin
0
280
Featured
See All Featured
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Code Reviewing Like a Champion
maltzj
521
39k
Fantastic passwords and where to find them - at NoRuKo
philnash
51
3k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
4
400
Rails Girls Zürich Keynote
gr2m
94
13k
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
Why Our Code Smells
bkeepers
PRO
336
57k
Documentation Writing (for coders)
carmenintech
69
4.6k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
129
19k
Side Projects
sachag
452
42k
Done Done
chrislema
182
16k
Gamification - CAS2011
davidbonilla
80
5.2k
Transcript
© Cake.jp Co.Ltd. All Right Reserved.|Confidential 2024/04/11 ランダム処理を修正し、DBの負荷を 下げた話
山内 啓輔
2 © Cake.jp Co.Ltd. All Right Reserved.|Confidential 自己紹介 山内 啓輔
やまうち けいすけ 担当業務 カテゴリーページ、検索機能など 🍰おすすめスイーツ 元祖かぼちゃプリン 約1.2kg かぼちゃ感が強く、甘さが控えめで美味し い! 付属のカラメルをかけることで甘さもアップ カテゴリページ 検索機能
3 © Cake.jp Co.Ltd. All Right Reserved.|Confidential 今日話す内容 1. 何が起きたのか
2. どういった処理なのか 3. どういった対応をしたのか 4. その対応でどうなったのか 5. まとめ
4 © Cake.jp Co.Ltd. All Right Reserved.|Confidential 今日話す内容 1. 何が起きたのか
2. どういった処理なのか 3. どういった対応をしたのか 4. その対応でどうなったのか 5. まとめ
5 © Cake.jp Co.Ltd. All Right Reserved.|Confidential 何が起きたのか 前提:商品詳細ページについて どういった商品なのか確認できる商品詳細と呼ぶページがある
https://cake.jp/item/3388709/
6 © Cake.jp Co.Ltd. All Right Reserved.|Confidential 何が起きたのか 該当箇所 「この商品を見た人は、こんな商品も見ています
」という、 おすすめ商品を出している箇所の夜間バッチ
7 © Cake.jp Co.Ltd. All Right Reserved.|Confidential 何が起きたのか 事象 DBの負荷が爆上がりで、サイトにアクセスできない状況が発生した
8 © Cake.jp Co.Ltd. All Right Reserved.|Confidential 今日話す内容 1. 何が起きたのか
2. どういった処理なのか 3. どういった対応をしたのか 4. その対応でどうなったのか 5. まとめ
9 © Cake.jp Co.Ltd. All Right Reserved.|Confidential どういった処理なのか ざっくり判断基準 ブックマークを元に、その商品とのおすすめ度を判断している
ちょっと詳しく 対象の商品をブックマーク・購入している人がブックマークしている商品をおすすめの商品としている それを公開中の全商品分、夜間に行っている ※全商品 = 約8000商品、ブックマーク数 = 約130万件
10 © Cake.jp Co.Ltd. All Right Reserved.|Confidential どういった処理なのか SQLのイメージ
11 © Cake.jp Co.Ltd. All Right Reserved.|Confidential どういった処理なのか SQLのイメージ ※約130万件を8000回
12 © Cake.jp Co.Ltd. All Right Reserved.|Confidential 今日話す内容 1. 何が起きたのか
2. どういった処理なのか 3. どういった対応をしたのか 4. その対応でどうなったのか 5. まとめ
13 © Cake.jp Co.Ltd. All Right Reserved.|Confidential どういった対応をしたのか 対象を減らした ・過去のすべてデータを取るのではなく、過去
1年に減らす ・10件以上ブックマークされているもののみ取得 5000件程度まで対象が減る
14 © Cake.jp Co.Ltd. All Right Reserved.|Confidential どういった対応をしたのか ループ内での取得をやめる ループで行うべき条件がない・・・!
事前に取得をしておき、その結果をループで使用するように変更した ※再掲
15 © Cake.jp Co.Ltd. All Right Reserved.|Confidential どういった対応をしたのか SQLのランダム処理をやめる 100万件を超える取得結果に対してのランダム処理が処理が重いので、アプリ側で行うようにした
16 © Cake.jp Co.Ltd. All Right Reserved.|Confidential どういった対応をしたのか 対応まとめ ・検索対象を減らした
・過去のすべてデータを取るのではなく、過去 1年に減らす ・10件以上ブックマークされているもののみ取得 ・ループ内での処理をやめる ・ループ前にやっておける重い処理を事前に行った ・SQLでのランダム処理をやめた ・負荷の高いORDER BY RAND()をやめ、アプリで行うようにした
17 © Cake.jp Co.Ltd. All Right Reserved.|Confidential 今日話す内容 1. 何が起きたのか
2. どういった処理なのか 3. どういった対応をしたのか 4. その対応でどうなったのか 5. まとめ
18 © Cake.jp Co.Ltd. All Right Reserved.|Confidential その対応でどうなったのか 負荷が下がった!!
19 © Cake.jp Co.Ltd. All Right Reserved.|Confidential その対応でどうなったのか グラフがこうなった
20 © Cake.jp Co.Ltd. All Right Reserved.|Confidential 今日話す内容 1. 何が起きたのか
2. どういった処理なのか 3. どういった対応をしたのか 4. その対応でどうなったのか 5. まとめ
21 © Cake.jp Co.Ltd. All Right Reserved.|Confidential まとめ 得られた知見 ・この機能が作られた当初(2020/06)は問題にはなっていなかったが、データ量が増えたことでパ
フォーマンスの問題が露見した。 データの増加を見越して、負荷の高いクエリになっていないかどうかを意識してコードを書く必要があ る。 ・ループ内で行っている処理は、事前にまとめて行うことが可能かどうかを常に考える必要がある