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
顧客が本当に必要だったもの - パフォーマンス改善編 / Make what is needed
Search
soudai sone
PRO
October 29, 2024
Technology
15k
36
Share
顧客が本当に必要だったもの - パフォーマンス改善編 / Make what is needed
# 失敗から学ぶRDBの正しい歩き方
-
https://amzn.to/4e0CqfH
soudai sone
PRO
October 29, 2024
More Decks by soudai sone
See All by soudai sone
AI時代における具体と抽象の往復 - 日常にチャンスがある / Moving Between the Concrete
soudai
PRO
7
1.7k
制約を設計する - 非決定性との境界線 / Designing constraints
soudai
PRO
6
2.7k
APMの世界から見るOpenTelemetryのTraceの世界 / OpenTelemetry in the Java
soudai
PRO
0
380
失敗できる意思決定とソフトウェアとの正しい歩き方_-_変化と向き合う選択肢/ Designing for Reversible Decisions
soudai
PRO
11
3.5k
外部キー制約の知っておいて欲しいこと - RDBMSを正しく使うために必要なこと / FOREIGN KEY Night
soudai
PRO
15
6.4k
手を動かしながら学ぶデータモデリング - 論理設計から物理設計まで / Data modeling
soudai
PRO
43
11k
これからアウトプットする人たちへ - アウトプットを支える技術 / that support output
soudai
PRO
21
8.6k
コミュニティと計画的偶発性理論 - 出会いが人生を変える / Life-Changing Encounters
soudai
PRO
8
4.2k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
64
53k
Other Decks in Technology
See All in Technology
最初の一歩を踏み出せなかった私が、誰かの背中を押したいと思うようになるまで / give someone a push
mii3king
0
160
"SQLは書けません"から始まる データドリブン
kubell_hr
2
470
KGDC_13_Amazon Q Developerで挑む! 13事例から見えたAX組織変革の最前線_公開情報
kikugawa
0
120
AWS認定資格は本当に意味があるのか?
nrinetcom
PRO
1
270
猫でもわかるKiro CLI(CDKコーディング編)
kentapapa
1
130
The Journey of Box Building
tagomoris
4
1.9k
小説執筆のハーネスエンジニアリング
yoshitetsu
0
620
名刺メーカーDevグループ 紹介資料
sansan33
PRO
0
1.1k
Standards et agents IA : un tour d’horizon de MCP, A2A, ADK et plus encore
glaforge
0
150
AI와 협업하는 조직으로의 여정
arawn
0
210
EarthCopilotに学ぶマルチエージェントオーケストレーション
nakasho
0
290
インターネットの技術 / Internet technology
ks91
PRO
0
200
Featured
See All Featured
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.4k
Typedesign – Prime Four
hannesfritz
42
3k
Exploring anti-patterns in Rails
aemeredith
3
320
Discover your Explorer Soul
emna__ayadi
2
1.1k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
180
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
64
54k
The Limits of Empathy - UXLibs8
cassininazir
1
300
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
61k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.4k
Believing is Seeing
oripsolob
1
110
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
Navigating Weather and Climate Data
rabernat
0
170
Transcript
【ハイブリッド開催】わたし史上、最高のチューニング 顧客が本当に必要だったもの - パフォーマンス改善編
What is it?
結論:仕様を正しく変更するのが 一番パフォーマンスに効く What is it?
What is it?
ずっと同じことを言ってる What is it?
ずっと同じことを言ってる ↓ 今日はもうちょっと具体例の話 What is it?
1. 自己紹介 2. 複雑な仕様がRDBを殺す 3. 特効薬 : 仕様を削る 4. まとめ
あじぇんだ
1. 自己紹介 2. 複雑な仕様がRDBを殺す 3. 特効薬 : 仕様を削る 4. まとめ
あじぇんだ
自己紹介 曽根 壮大(40歳) Have Fun Tech LLC 代表社員 株式会社リンケージ CTO
兼 COO そ • 日本PostgreSQLユーザ会 勉強会分科会 担当 • 3人の子供がいます(長女、次女、長男) • 技術的にはWeb/LL言語/RDBMSが好きです • コミュニティが好き たけ ね とも
1. 自己紹介 2. 複雑な仕様がRDBを殺す 3. 特効薬 : 仕様を削る 4. まとめ
あじぇんだ
複雑な仕様がスロークエリや ロングトランザクションを生む 複雑な仕様がRDBを殺す
複雑な仕様がRDBを殺す
複雑な仕様がRDBを殺す
これは本当に闇が深い 複雑な仕様がRDBを殺す
ECサイトの例 複雑な仕様がRDBを殺す
ECサイトの例 ↓ 購入のボタンがめちゃ重い 複雑な仕様がRDBを殺す
1. 商品の在庫を確保 2. ポイントの利用 3. クーポンの利用 4. キャンペーンの確認 5. 決済処理
6. 配送手続き処理 7. ポイント付与 8. 購入履歴の追加 9. 通知処理 複雑な仕様がRDBを殺す これを全部 1つのトランザクションまとめる
1. 商品の在庫を確保 2. ポイントの利用 3. クーポンの利用 4. キャンペーンの確認 5. 決済処理
6. 配送手続き処理 7. ポイント付与 8. 購入履歴の追加 9. 通知処理 複雑な仕様がRDBを殺す これを全部 1つのトランザクションまとめる いきなりUPDATEとかで ロックを取ると後続が詰まる
1. 商品の在庫を確保 2. ポイントの利用 3. クーポンの利用 4. キャンペーンの確認 5. 決済処理
6. 配送手続き処理 7. ポイント付与 8. 購入履歴の追加 9. 通知処理 複雑な仕様がRDBを殺す これを全部 1つのトランザクションまとめる 処理の数だけクエリを投げて集計する
1. 商品の在庫を確保 2. ポイントの利用 3. クーポンの利用 4. キャンペーンの確認 5. 決済処理
6. 配送手続き処理 7. ポイント付与 8. 購入履歴の追加 9. 通知処理 複雑な仕様がRDBを殺す これを全部 1つのトランザクションまとめる 処理の数だけクエリを投げて集計する 無理に1回のクエリで対応しようとして、 超複雑なクエリが生まれる
1. 商品の在庫を確保 2. ポイントの利用 3. クーポンの利用 4. キャンペーンの確認 5. 決済処理
6. 配送手続き処理 7. ポイント付与 8. 購入履歴の追加 9. 通知処理 複雑な仕様がRDBを殺す これを全部 1つのトランザクションまとめる 処理の数だけクエリを投げて集計する 無理に1回のクエリで対応しようとして、 超複雑なクエリが生まれる さらにN+1のループがあったりする
1. 商品の在庫を確保 2. ポイントの利用 3. クーポンの利用 4. キャンペーンの確認 5. 決済処理
6. 配送手続き処理 7. ポイント付与 8. 購入履歴の追加 9. 通知処理 複雑な仕様がRDBを殺す これを全部 1つのトランザクションまとめる 外部APIだったりする
1. 商品の在庫を確保 2. ポイントの利用 3. クーポンの利用 4. キャンペーンの確認 5. 決済処理
6. 配送手続き処理 7. ポイント付与 8. 購入履歴の追加 9. 通知処理 複雑な仕様がRDBを殺す これを全部 1つのトランザクションまとめる 外部APIだったりする しかも時々めちゃレスポンスが遅い ISUCON9の予選問題がこれ
1. 商品の在庫を確保 2. ポイントの利用 3. クーポンの利用 4. キャンペーンの確認 5. 決済処理
6. 配送手続き処理 7. ポイント付与 8. 購入履歴の追加 9. 通知処理 複雑な仕様がRDBを殺す これを全部 1つのトランザクションまとめる ここも外部APIだったりする 失敗したりするとロールバックでやり直し ここが終わってやっと画面遷移が終わる
全部を同時実行する必要はない 複雑な仕様がRDBを殺す
全部を同時実行する必要はない ↓ ユーザが知りたいのは購入できた事実 複雑な仕様がRDBを殺す
1. 商品の在庫を確保 2. ポイントの利用 3. クーポンの利用 4. キャンペーンの確認 5. 決済処理
6. 配送手続き処理 7. ポイント付与 8. 購入履歴の追加 9. 通知処理 複雑な仕様がRDBを殺す 在庫を確保できば後続は非同期にできる
1. 商品の在庫を確保 2. ポイントの利用 3. クーポンの利用 4. キャンペーンの確認 5. 決済処理
6. 配送手続き処理 7. ポイント付与 8. 購入履歴の追加 9. 通知処理 複雑な仕様がRDBを殺す 後続で処理して 失敗したら購入を取り消す
1. 商品の在庫を確保 2. ポイントの利用 3. クーポンの利用 4. キャンペーンの確認 5. 決済処理
6. 配送手続き処理 7. ポイント付与 8. 購入履歴の追加 9. 通知処理 複雑な仕様がRDBを殺す 商品次第ではここさえ確定できれば、 あとは非同期にできる
ロングトランザクション対策 複雑な仕様がRDBを殺す
ロングトランザクション対策 ↓ 分割する 複雑な仕様がRDBを殺す
???「でも全部同じテーブルなんですよ」 複雑な仕様がRDBを殺す
複雑な仕様がRDBを殺す
???「でも全部同じテーブルなんですよ」 ↓ ライフサイクルに合わせてテーブルは分割 複雑な仕様がRDBを殺す
ちゃんと正規化する 責務を正しく分ける 複雑な仕様がRDBを殺す
ここまでシンプルな実装を目指しましょうと強調してきました が、「シンプルな実装」とはなんでしょうか。RDBMSを使う上で シンプルな実装のヒントは正規化です。正規化のコツは次の ように表現できます。 • 事実だけを保存する • 重複がない
• 不整合がない • nullがない これらを意識して設計していくとシンプルな設計に近づいてい きます。 また正規化を行う際はここまで説明したとおり、種別と状態を 考えることも重要です。ライフサイクルが違うデータは往々に して状態や種別が異なります。 場合によってはnullになるよう なカラムやUPDATEが必要なレコードは状態を持っている可 能性があります。こうしたテーブルが見つかった場合はより 深く考察する必要があります。 https://agilejourney.uzabase.com/entry/2022/07/28/103000
そして最後にINDEXの数にも注目しましょう。主キーは必ずあ りますが、外部キー制約とユニーク制約を除いたINDEXは主 に検索のために必要なINDEXです。検索のWHEREの対象の 数だけそのテーブルの責務が大きいといえ、4つ以上の INDEXが必要な場合も同じく深く考察する必要があります。隠 れた状態をWHEREで絞り込んでいたり、種別をWHEREで絞り 込んでいるケースが見えてくることがあります。 このようにシンプルな設計を目指して考察を繰り返していくこ とが重要です。そして同じくらい重要なこととして認識すべき
はイージーとシンプルは両立できる、ということです。 シンプ ルを目指し考察を繰り返すことがまさにデータモデリングであ り、変化に強い設計につながっていくのです。 https://agilejourney.uzabase.com/entry/2022/07/28/103000
複雑な仕様がRDBを殺す
1. 自己紹介 2. 複雑な仕様がRDBを殺す 3. 特効薬 : 仕様を削る 4. まとめ
あじぇんだ
特効薬:仕様を削る
ずっとこれ言ってる 特効薬:仕様を削る
ずっとこれ言ってる ↓ 代表格を紹介します 特効薬:仕様を削る
ページャの原罪 特効薬:仕様を削る
ページャの原罪 ↓ ページャの業は深い 特効薬:仕様を削る
1つ目 対象総件数の表示 特効薬:仕様を削る
特効薬:仕様を削る
特効薬:仕様を削る このcount(*)が不要なクエリを生む
特効薬:仕様を削る 今はGoogleも表示していない
sql_culc_found_rows の呪い 特効薬:仕様を削る
sql_culc_found_rows の呪い 特効薬:仕様を削る MySQLで全体件数を取得するために使われていた MySQL 8.0.17で非推奨になった
通知の未読件数とかも一緒 基本的には未読かどうかわかれば良い 特効薬:仕様を削る アプリ 999 数字は不要
INDEXが活用できないcount()は めちゃめちゃ遅い 特効薬:仕様を削る テーブルスキャンだから
INDEXが活用できないcount()は めちゃめちゃ遅い 特効薬:仕様を削る テーブルスキャンだから 複雑な検索フォームの場合 テーブルスキャンになるケースで刺さる
2つ目 最終ページのリンク 特効薬:仕様を削る
特効薬:仕様を削る
ORDER BYの LIMIT OFFSETに刺さる 特効薬:仕様を削る
特効薬:仕様を削る
特効薬:仕様を削る
最終ページに行きたい? 昇順、降順で良い 特効薬:仕様を削る
そもそもユーザが必要なのは 検索フォームだったりする 特効薬:仕様を削る
そもそもユーザが必要なのは 検索フォームだったりする 特効薬:仕様を削る これもこれで闇が深いが … 部分一致とかORとか…
これらは単純に仕様を消せば 実装不要でパフォーマンスも改善する 特効薬:仕様を削る
特効薬:仕様を削る
What is it? 必要最小限を提供する
本当に必要なモノだけを 実装していますか? 特効薬:仕様を削る
1. 自己紹介 2. 複雑な仕様がRDBを殺す 3. 特効薬 : 仕様を削る 4. まとめ
あじぇんだ
複雑な仕様がRDBを殺す
まとめ Simple is Beautiful
まとめ Simple is Beautiful ↓ 常に追求した者だけが辿り着ける
まとめ 本当に必要なモノを実装する
まとめ 本当に必要なモノを実装する ↓ そのためにプロダクト、ドメインと向き合う
まとめ
まとめ 質を追求した結果 パフォーマンスは後からついてくる
良いソフトウェアを作ろう 目の前のプロダクトに向き合おう まとめ
昨日の自分に誇れる 今日の自分になろう まとめ
ご清聴ありがとうございました まとめ