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
データの構造から再検討するパフォーマンスチューニング
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
freee
PRO
January 21, 2020
Technology
7.7k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
データの構造から再検討するパフォーマンスチューニング
freee
PRO
January 21, 2020
More Decks by freee
See All by freee
freeeにおけるAI分析エージェントの実践
freee
PRO
0
360
クラウドネイティブ会議Day1_AI時代の開発スピードに追いつけ! Argo CD ApplicationSetと挑む、PR単位の検証環境/Cloud Native Conference Day 1: Keeping Pace with Development Speeds in the AI Era! Building a Pull Request-Level Testing Environment with Argo CD ApplicationSet
freee
PRO
0
300
激動のAI導入ミッションに、 freeeのセキュリティチームはどう向き合ったのか/How did freee's security team tackle the turbulent AI implementation mission
freee
PRO
0
2k
10分で分かるfreee__エンジニア向け会社説明資料/freee in 10 Minutes Company Overview for Engineers
freee
PRO
0
64
20251115_btconJP_フリー社における生成AI活用の試行錯誤とこれから
freee
PRO
1
280
dbt platform導入前の不安を解消する───リアルな一ヶ月検証記/Addressing Concerns Before Implementing the dbt Platform: A Real-World One-Month Trial
freee
PRO
0
1.1k
AIと共に開発する時代の組織、プロセス設計 freeeでの実践から見えてきたこと
freee
PRO
4
1.7k
10分でわかるfreeeのPdM
freee
PRO
30
27k
AI時代の開発組織デザイン
freee
PRO
0
220
Other Decks in Technology
See All in Technology
AmplifyHostingConstructからSSRフレームワークのためのホスティング設計を考察する/amplify-hosting-construct
fossamagna
1
280
SRENEXT_2026_Chairs__Talks_in_Tamachi.sre.pdf
srenext
1
100
AI時代におけるエンジニアの新たな役割──FDEとクオリアの探求/登壇資料(戸井田 裕貴)
hacobu
PRO
0
270
全員がリーダーである世界へ キリマンジャロ登頂とシェアド・リーダー
jinwatanabe
0
120
Webアプリ認証の全体像 / The Big Picture of Web App Authentication
kitano_yuichi
1
400
[2026-07-15] AI Ready なはずだったアーキテクチャと、見えてきた課題・次に目指す状態
wxyzzz
12
4.1k
41歳でAWSが好きすぎてITエンジニアになったおっさんの話
yama3133
1
710
複数プロダクトで進めるAI機能実装 ── 実践から得たリアルな学びとロードマップ実現への挑戦 / AICon2026_yanari
rakus_dev
0
250
Data + AI Summit 2026 イベントレポート: 「AIがビジネスで意思決定するデータ基盤」へ
nek0128
0
300
現場との対話から始める “作る前に問い直す”業務改善
mochico50
1
150
Type-safe IaC for Dart
coborinai
0
180
伝票作成AIエージェントを支える、LLMOpsとインフラの選択肢 / AICon2026_takeda
rakus_dev
0
250
Featured
See All Featured
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.6k
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
3
350
A better future with KSS
kneath
240
18k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
260
Rails Girls Zürich Keynote
gr2m
96
14k
[SF Ruby Conf 2025] Rails X
palkan
2
1.2k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.5k
The browser strikes back
jonoalderson
0
1.4k
Git: the NoSQL Database
bkeepers
PRO
432
67k
Docker and Python
trallard
47
4k
Google's AI Overviews - The New Search
badams
0
1.1k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.3k
Transcript
freee גࣜձࣾ σʔλͷߏ͔Β࠶ݕ౼͢ΔύϑΥʔϚϯενϡʔχϯά 2019.01.21
takuya kubo @tkuboma ॴଐνʔϜʢࡶձܭ ਓؒνʔϜʣ 2 ܦྺ • Sierͱͯ͠ෳاۀΛసʑ ◦
ओʹ௨৴ܥͷόοΫΤϯυ • ࣄۀձࣾͰհޢٻιϑτͷ։ൃʹैࣄ ◦ ৽نɾอक։ൃɺࢢௐࠪɺίʔϧηϯλʔͳͲ • 20177݄ freee ʹ join ◦ ձܭνʔϜॴଐ ▪ ৽نɾอक։ൃ ◦ νʔϜࠈ ͔Β νʔϜਓؒ ▪ ਃυϝΠϯͷϚΠΫϩαʔϏεԽ ▪ ܾࢉυϝΠϯपลͷอक։ൃ झຯ • ͓ञ • ࢠڙ
ɹ02ɹDBपΓͷύϑΥʔϚϯεվળ ɹ01ɹfreeeͷࢹपΓʹ͍ͭͯ؆୯ʹ Agenda 03ɹ·ͱΊ
01 Section freeeͷࢹपΓʹ͍ͭͯ؆୯ʹ
5 • Mackerel ◦ ֎ܗࢹɾαʔόʔϨϕϧͰࢹ ◦ Slackʹ௨ • NewRelic ◦
ΞϓϦέʔγϣϯͷੑೳࢹ ◦ ϘτϧωοΫͱͳ͍ͬͯΔ End-point ֬ೝ • Monyog ◦ queryϨϕϧͰࢹ ◦ ϝʔϧ௨ • Datadog (࠷ۙಋೖ࢝͠Ίͨ) ◦ KubernetesڥͷࢹʹɺΑΓదͳSaaSͱͯ͠ಋೖ freeeͷࢹपΓʹ͍ͭͯ؆୯ʹ
02 Section DBपΓͷύϑΥʔϚϯεվળ
7 DBपΓͷύϑΥʔϚϯεվળ 1. indexͰνϡʔχϯά 2. ΫΤϦͷมߋͰνϡʔχϯά 3. σʔλͷ࣋ͪํͷݟ͠ 4. ςʔϒϧߏͷݟ͠
5. ػೳͷݟ͠
8 DBपΓͷύϑΥʔϚϯεվળ 1. indexͰνϡʔχϯά 2. ΫΤϦͷมߋͰνϡʔχϯά 3. σʔλͷ࣋ͪํͷݟ͠ 4. ςʔϒϧߏͷݟ͠
5. ػೳͷݟ͠
9 • ༰ ◦ ୯७ʹindexΛషΔඞཁ͕͋Δ ◦ indexΛར༻Ͱ͖͍ͯͳ͍ DBपΓͷύϑΥʔϚϯεվળ explain SELECT
* FROM औҾઌ WHERE ໊લ = 'גࣜձࣾA' ************* 1. row ************* id: 1 select_type: SIMPLE table: औҾઌ partitions: NULL type: ALL explain SELECT औҾ.* FROM औҾ INNER JOIN ༁ ON ༁.id = ༁.औҾ_id WHERE औҾ.ࣄۀॴ_id = 111 AND ༁.༁ >= '2019-10-10'; *************** 1. row **************** key: index=औҾ_ࣄۀॴ_id
10 • ରԠ ◦ ඞཁͳΧϥϜʹindexΛషΔ ◦ ࣮ߦܭըΛݟͯదͳindexΛར༻Ͱ͖͍ͯͳ͍ΫΤϦͷमਖ਼ SELECT औҾ.* FROM
औҾ INNER JOIN ༁ ON ༁.id = ༁.औҾ_id WHERE औҾ.ࣄۀॴ_id = 111 AND ༁.ࣄۀॴ_id = 111 AND ༁.༁ >= '2019-10-10'; mysql> SHOW INDEX FROM औҾ; +-------+-----------------------------+------------------+---------------------+----------------+ | Table | Key_name | Seq_in_index | Column_name | Cardinality | +-------+-----------------------------+------------------+---------------------+----------------+ | ༁ | PRIMARY | 1 | id | 936 | | ༁ | ࣄۀॴ_ID | 1 | ࣄۀॴ_id | 29 | +-------+-----------------------------+------------------+---------------------+----------------+ mysql> SHOW INDEX FROM ༁; +-------+-----------------------------+------------------+---------------------+----------------+ | Table | Key_name | Seq_in_index | Column_name | Cardinality | +-------+-----------------------------+------------------+---------------------+----------------+ | ༁ | PRIMARY | 1 | id | 2627 | | ༁ | ࣄۀॴ_ID_༁ | 1 | ࣄۀॴ_id | 29 | | ༁ | ࣄۀॴ_ID_༁ | 2 | ༁ | 467 | +-------+-----------------------------+------------------+---------------------+----------------+ SELECT औҾ.* FROM औҾ INNER JOIN ༁ ON ༁.id = ༁.औҾ_id WHERE औҾ.ࣄۀॴ_id = 111 AND ༁.༁ >= '2019-10-10'; ◦ Cardinality͕ߴ͍indexΛར༻Ͱ͖ΔΑ͏ʹ͢Δ DBपΓͷύϑΥʔϚϯεվળ
11 ༁model scope :༁Ҏ্, ->() do where('༁ΧϥϜ >= ?', )
end • ͳͥ࿙ΕΔʁ ◦ ActiveRecord ͷ scope Λར༻͍ͯ͠Δ ◦ ༁modelࣄۀॴmodelͱͷؔ࿈͕͋Γɺʮࣄۀॴ.༁.scopeʯͱݺͼग़͢ҝ indexΘΕΔ ◦ joinͷ࣌ࣄۀॴใ͕ೖΒͳ͍ҝɺվળલͷΫΤϦͱͳΔ > ࣄۀॴ.༁.༁Ҏ্('2019-10-10') SELECT * FROM ༁ WHERE ༁.ࣄۀॴ_id = '111' AND ༁.༁ >= '2020-01-01' > ࣄۀॴ.औҾ.joins(༁).merge(༁.༁Ҏ্('2019-10-10')) SELECT * FROM औҾ ɹINNER JOIN ༁ ON ༁.औҾ_id = औҾ.id WHERE औҾ.ࣄۀॴ_id = '111' AND ༁.༁ >= '2020-01-01' ༁model scope :༁Ҏ্, ->(ࣄۀॴ_id, ) do where('ࣄۀॴ_id = ? AND ༁ΧϥϜ >= ?', ࣄۀॴ_id, ) end > ࣄۀॴ.औҾ.joins(༁).merge(༁.༁Ҏ্(111, '2019-10-10')) SELECT * FROM औҾ ɹINNER JOIN ༁ ON ༁.औҾ_id = औҾ.id WHERE ɹऔҾ.ࣄۀॴ_id = '111' AND ༁.ࣄۀॴ_id = '111' AND ༁.༁ >= '2020-01-01' DBपΓͷύϑΥʔϚϯεվળ
12 • ҙ͍ͯ͠Δࣄ ◦ indexΛషΔ࣌ؒ(௨ৗσϓϩΠͰ࣮ࢪ͢Δ͔ɺϝϯςͰΔ͔) ◦ ۀɺσʔλΛߟ͑ແବʹindexΛషΒͳ͍ ◦ मਖ਼Λݕূ͢Δࡍຊ൪૬ͷσʔλͰݕূ͢Δ DBपΓͷύϑΥʔϚϯεվળ
13 DBपΓͷύϑΥʔϚϯεվળ 1. indexͰνϡʔχϯά 2. ΫΤϦͷมߋͰνϡʔχϯά 3. σʔλͷ࣋ͪํͷݟ͠ 4. ςʔϒϧߏͷݟ͠
5. ػೳͷݟ͠
14 • ༰ ◦ ରσʔλͷrow͕େ͖͗͢Δ mysql> SELECT DISTINCT ༁.औҾઌ_id FROM
༁ WHERE ༁.Ϣʔβʔ_id = 111; ----------- 4001 rows in set (12.37 sec) explain SELECT DISTINCT ༁.औҾઌ_id FROM ༁ WHERE ༁.ࣄۀॴ_id = 111; ***** 1. row ***** rows: 20000000 ◦ ༁ϢʔβͰ࠷େڃͷϨίʔυΛތΔςʔϒϧ DBपΓͷύϑΥʔϚϯεվળ
15 • ରԠ ◦ row͕ߜΒΕΔςʔϒϧΛΫΤϦʹՃ͑Δ mysql> SELECT DISTINCT ༁.औҾઌ_id FROM
༁ WHERE ༁.ࣄۀॴ_id = 111; ----------- 4001 rows in set (12.37 sec) mysql> SELECT DISTINCT औҾઌ.id FROM औҾઌ INNER JOIN ༁ ON partners.id = ༁.औҾઌ_id WHERE औҾઌ.ࣄۀॴ_id = 111; ----------- 4000 rows in set (0.10 sec) ***** 1. row ***** rows: 20000000 ***** 1. row ***** rows: 3000 ***** 2. row ***** rows: 40 ◦ ΑΓগͳ͍औҾઌͷςʔϒϧΛ݅ʹೖΕΔ͜ͱʹΑΓrow͕Γܶతʹૣ͘ͳΔ DBपΓͷύϑΥʔϚϯεվળ
16 • ҙ͍ͯ͠Δࣄ ◦ ςʔϒϧͷσʔλͷ૿Ճͷ֯ ◦ ΫΤϦͷ݁Ռ͕มΘΒͳ͍͔൱͔ ◦ ΞϓϦέʔγϣϯଆʹॲཧΛҕ͢ΔܗʹͳΔҝɺΞϓϦέʔγϣϯଆͷෛՙ૿ DBपΓͷύϑΥʔϚϯεվળ
17 DBपΓͷύϑΥʔϚϯεվળ 1. indexͰνϡʔχϯά 2. ΫΤϦͷมߋͰνϡʔχϯά 3. σʔλͷ࣋ͪํͷݟ͠ 4. ςʔϒϧߏͷݟ͠
5. ػೳͷݟ͠
18 • ༰ ◦ idͰͳ͘StringͰjoin͍ͯ͠Δ ◦ Ϛελʔσʔλͱڞଘ͢Δใ͕ଘࡏ͢Δ SELECT צఆՊ.* FROM
צఆՊ WHERE צఆՊ.Ϣʔβʔ_id = γεςϜϢʔβʔ.id UNION SELECT צఆՊ.* FROM צఆՊ WHERE צఆՊ.Ϣʔβʔ_id = Ϣʔβʔ.id; DBपΓͷύϑΥʔϚϯεվળ
19 • ରԠ ◦ ؔ࿈idͷΧϥϜΛՃ͠idͰjoin͢Δ ◦ ϚελʔσʔλΛϢʔβଆʹίϐʔ͠readϢʔβʔσʔλͷΈʹ͢Δ SELECT צఆՊ.* FROM
צఆՊ WHERE צఆՊ.Ϣʔβʔ_id = Ϣʔβʔ.id; DBपΓͷύϑΥʔϚϯεվળ
20 • ҙ͍ͯ͠Δࣄ ◦ ϚελʔσʔλΛίϐʔ͢ΔλΠϛϯά ◦ ͋ΔఔαʔϏε͕େ͖͘ͳ͔ͬͯΒͩͱमਖ਼ίετ͕ߴ͍ҝɺઃܭஈ֊Ͱݕ౼͍ͨ͠ ◦ සൟʹϚελʔσʔλ͕มߋ͞ΕΔςʔϒϧͷ߹ɺϝϯςίετ͕ߴ͘ͳΔҝผͷରॲΛݕ౼ ▪
࠷ॳ͔ΒΫΤϦΛ͚ΔͳͲ DBपΓͷύϑΥʔϚϯεվળ
21 DBपΓͷύϑΥʔϚϯεվળ 1. indexͰνϡʔχϯά 2. ΫΤϦͷมߋͰνϡʔχϯά 3. σʔλͷ࣋ͪํͷݟ͠ 4. ςʔϒϧߏͷݟ͠
5. ػೳͷݟ͠
22 • ༰ ◦ େྔσʔλΛूܭͯ͠ද͍ࣔͯ͠Δ DBपΓͷύϑΥʔϚϯεվળ
23 • ରԠ ◦ ूܭςʔϒϧΛ࡞ʢѹॖͷߴ͍ςʔϒϧΛ࡞ʣ ◦ ༁σʔλొɺߋ৽࣌ʹ1ͷσʔλΛूܭͯ͠อଘ͢Δ DBपΓͷύϑΥʔϚϯεվળ
24 • ৽ͨͳൃੜ ◦ ొ࣌ͷύϑΥʔϚϯε ◦ ָ؍ϩοΫΤϥʔ ◦ ΪϟοϓϩοΫʹΑΔϩοΫͪ ◦
ϑΝϯτϜϦʔυʹΑΔσʔλෆ߹ • ରࡦ ◦ ूܭσʔλͷอଘΛผτϥϯβΫγϣϯͰඇಉظʹ ◦ ࣄۀॴɺूܭ୯ҐͱͳΔଐੑΛΩʔͱͯ͠ॲཧΛγϟʔσΟϯάͯ͠ɺಉͭ͡ྻʹ·ͱΊ࣮ͯߦ͢Δ ༁σʔλ ͷอଘ ूܭσʔλ ͷอଘ DBपΓͷύϑΥʔϚϯεվળ
KinesisΛར༻ͨ͠ूܭςʔϒϧͷߋ৽ Kinesis Stream RDS ूܭ Server ձܭfreee Server 1. ݩσʔλUpdate
2. ूܭϦΫΤετQueuing 3. Polling 4. Data Fetch 5. ूܭσʔλUpdate DBपΓͷύϑΥʔϚϯεվળ
26 • ҙ͍ͯ͠Δࣄ ◦ ूܭςʔϒϧͷσʔλͷΓํ ◦ ొ࣌ͷίετ૿ ◦ ूܭσʔλදࣔͷϦΞϧλΠϜੑΛଛͳ͏ͨΊϢʔβʔͷࠂͳͲ ◦
վળʹ͔ͳΓͷ͕͔͔࣌ؒΔ DBपΓͷύϑΥʔϚϯεվળ
27 DBपΓͷύϑΥʔϚϯεվળ 1. indexͰνϡʔχϯά 2. ΫΤϦͷมߋͰνϡʔχϯά 3. ςʔϒϧߏͷݟ͠ 4. σʔλͷ࣋ͪํͷݟ͠
5. ػೳͷݟ͠
28 • ༰ ◦ ඞཁҎ্ʹ࣮ߦ͞Ε͍ͯΔՄೳੑΛٙ͏ ▪ Homeը໘ΞΫηεͰݺΕΔ DBपΓͷύϑΥʔϚϯεվળ
29 • ରԠ ◦ ϢʔβʔΞΫγϣϯϕʔεͰͷऔಘʹมߋ ◦ ඇಉظԽ • ҙ͍ͯ͠Δࣄ ◦
ϏδωεαΠυ(Ϣʔβʔ)ͱͷίϛϡχέʔγϣϯ ◦ ϢʔβʔϝϦοτͱӡ༻ίετʹ͍ͭͯ DBपΓͷύϑΥʔϚϯεվળ
30 • slave ◦ Өڹͳ͍selectܥslave ◦ write͕ଟ͍αʔϏε replication latency ʹҙ
• N + 1ͷղফ ◦ bullet ͷಋೖ • ݕࡧ෦ͷ Elasticsearch Խ ◦ େྔσʔλͷ݅ݕࡧ࣌ ◦ ᐆດݕࡧ࣌ • γϟʔσΟϯάͷݕ౼ DBपΓͷύϑΥʔϚϯεվળ
03 Section ·ͱΊ
32 • νϡʔχϯάద࣮ٓࢪ͠·͠ΐ͏ • ϚελʔσʔλͱͷڞଘՄೳͳݶΓආ͚·͠ΐ͏ • ߏͷݟ͠ૣΊʹ͠·͠ΐ͏ ·ͱΊ
εϞʔϧϏδωεΛɺ ੈքͷओʹɻ