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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
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.3k
制約を設計する - 非決定性との境界線 / Designing constraints
soudai
PRO
6
2.7k
APMの世界から見るOpenTelemetryのTraceの世界 / OpenTelemetry in the Java
soudai
PRO
0
370
失敗できる意思決定とソフトウェアとの正しい歩き方_-_変化と向き合う選択肢/ Designing for Reversible Decisions
soudai
PRO
11
3.4k
外部キー制約の知っておいて欲しいこと - 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.1k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
64
53k
Other Decks in Technology
See All in Technology
明日からドヤれる!超マニアックなAWSセキュリティTips10連発 / 10 Ultra-Niche AWS Security Tips
yuj1osm
0
510
Amazon S3 Filesについて
yama3133
2
150
AI駆動1on1〜AIに自分を育ててもらう〜
yoshiakiyasuda
0
110
扱える不確実性を増やしていく - スタートアップEMが考える「任せ方」
kadoppe
0
110
Azure Lifecycle with Copilot CLI
torumakabe
3
970
最近の技術系の話題で気になったもの色々(IoT系以外も) / IoTLT 花見予定会(たぶんBBQ) @都立潮風公園バーベキュー広場
you
PRO
1
200
20260415_生成AIを専属DSに_自動レポート作成_ハンズオン_交通事故データ
doradora09
PRO
0
100
3つのボトルネックを解消し、リリースエンジニアリングを再定義した話
nealle
0
500
申請待ちゼロへ!AWS × Entra IDで実現した「権限付与」のセルフサービス化
mhrtech
2
320
EBS暗号化に失敗してEC2が動かなくなった話
hamaguchimmm
1
130
JOAI2026講評会資料(近藤佐介)
element138
1
140
名刺メーカーDevグループ 紹介資料
sansan33
PRO
0
1.1k
Featured
See All Featured
Why Our Code Smells
bkeepers
PRO
340
58k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
The Pragmatic Product Professional
lauravandoore
37
7.2k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.1k
Leo the Paperboy
mayatellez
7
1.6k
sira's awesome portfolio website redesign presentation
elsirapls
0
210
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.2k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8k
A better future with KSS
kneath
240
18k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
120
Documentation Writing (for coders)
carmenintech
77
5.3k
We Are The Robots
honzajavorek
0
210
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 ↓ 常に追求した者だけが辿り着ける
まとめ 本当に必要なモノを実装する
まとめ 本当に必要なモノを実装する ↓ そのためにプロダクト、ドメインと向き合う
まとめ
まとめ 質を追求した結果 パフォーマンスは後からついてくる
良いソフトウェアを作ろう 目の前のプロダクトに向き合おう まとめ
昨日の自分に誇れる 今日の自分になろう まとめ
ご清聴ありがとうございました まとめ