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
22
ランダム処理を修正し、DBの負荷を下げた話
Keisuke Yamauchi
April 12, 2024
Tweet
Share
More Decks by Keisuke Yamauchi
See All by Keisuke Yamauchi
Cake.jpのCRM 今と未来
kechiiin
0
27
半年かけてPHP5.6からPHP7.4までバージョンアップした苦労と工夫 PHPカンファレンス福岡2024
kechiiin
1
410
(弊社の)OpenSearchに潜んでいた罠
kechiiin
0
70
before/afterで見る Cake.jpのアジャイル開発
kechiiin
0
13
レガシーからモダンへ? PHP5.6からの脱却
kechiiin
0
260
Featured
See All Featured
Typedesign – Prime Four
hannesfritz
40
2.4k
GitHub's CSS Performance
jonrohan
1031
460k
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
Git: the NoSQL Database
bkeepers
PRO
427
64k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
59k
Java REST API Framework Comparison - PWX 2021
mraible
28
8.3k
[RailsConf 2023] Rails as a piece of cake
palkan
53
5.1k
Thoughts on Productivity
jonyablonski
68
4.4k
BBQ
matthewcrist
85
9.4k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
28
4.4k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
3
180
Speed Design
sergeychernyshev
25
680
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)は問題にはなっていなかったが、データ量が増えたことでパ
フォーマンスの問題が露見した。 データの増加を見越して、負荷の高いクエリになっていないかどうかを意識してコードを書く必要があ る。 ・ループ内で行っている処理は、事前にまとめて行うことが可能かどうかを常に考える必要がある