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
freee
PRO
January 21, 2020
Technology
7.8k
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
AI Readyの正体はデータマネジメントだ メダリオン2.0の最前線
freee
PRO
0
570
freee が目指す データ マネジメント戦略 AI-Ready 時代を支える 攻めのガバナンスとは
freee
PRO
0
610
仕様駆動開発へのトライを機に チームに適合する手法を模索し続けている話
freee
PRO
0
700
freeeにおけるEvalsの実践例の紹介
freee
PRO
0
170
freeeにおけるAI分析エージェントの実践
freee
PRO
0
480
クラウドネイティブ会議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
410
激動のAI導入ミッションに、 freeeのセキュリティチームはどう向き合ったのか/How did freee's security team tackle the turbulent AI implementation mission
freee
PRO
0
2.2k
10分で分かるfreee__エンジニア向け会社説明資料/freee in 10 Minutes Company Overview for Engineers
freee
PRO
0
270
20251115_btconJP_フリー社における生成AI活用の試行錯誤とこれから
freee
PRO
1
350
Other Decks in Technology
See All in Technology
AIエージェントの開発・提供におけるセキュリティリスクの論点と対策
flatt_security
1
490
2026-09-04 SRE Tech Talk #15 怠惰なTerraform / Lazy Terraform
masasuzu
0
150
リージョンの壁を越える、 ちょっと変わったAWSサービスの話
falken
PRO
0
170
本番に近いテストをもっと手軽に - Postmanで広がるAPIテストの世界 / Expanding the World of API Testing with Postman
yokawasa
1
240
[RSJ26] Building a VLA Model Based on Self-Distilled Classification
keio_smilab
PRO
0
180
Bet AI Day 2026丨AIを「使う」から、AIが「働く」へ ― LayerXが進める「組織AI」の社会実装
layerx
PRO
2
1.8k
【5分でわかる】セーフィー エンジニア向け会社紹介
safie_recruit
0
55k
Jetpack Compose で挑む新聞紙面UI ─ 複合ジェスチャー・ポリゴン記事領域・適応的ページ構成という3つの壁/droidkaigi2026
nikkei_engineer_recruiting
0
160
【Oracle AI Spotlight ウェビナー】AWSか、Azureか、Google Cloudか。その議論にオラクルを含める意義。
oracle4engineer
PRO
1
210
分割40%キーボードにスムーズに入門するには
hoto17296
1
220
AI時代に、プロダクトの数だけ積み上がる所有コストをどうエンジニアリングするか / Engineering the Cost of Ownership
kzkmaeda
0
850
bet_ai_day_2026_session02
agenticsec
1
790
Featured
See All Featured
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.5k
Design in an AI World
tapps
1
300
Deep Space Network (abreviated)
tonyrice
0
290
Why You Should Never Use an ORM
jnunemaker
PRO
61
10k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
3k
The Spectacular Lies of Maps
axbom
PRO
1
970
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
67
58k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
590
Designing for humans not robots
tammielis
254
26k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
69
65k
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 • νϡʔχϯάద࣮ٓࢪ͠·͠ΐ͏ • ϚελʔσʔλͱͷڞଘՄೳͳݶΓආ͚·͠ΐ͏ • ߏͷݟ͠ૣΊʹ͠·͠ΐ͏ ·ͱΊ
εϞʔϧϏδωεΛɺ ੈքͷओʹɻ