Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
データの構造から再検討するパフォーマンスチューニング
Search
freee
PRO
January 21, 2020
Technology
7.9k
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に点在する案件・プロジェクトを統合するための案件マスタ開発
freee
PRO
0
23
freeeにおけるSoftware Factory
freee
PRO
0
60
freeeにおける AI を用いた ブラウザ動作確認の自動化の取り組み
freee
PRO
0
35
AIから最も使われやすいfreeeへ
freee
PRO
0
14
認知負荷との戦い〜 freee AIアシスタントの誕生からハーネス改善まで 〜
freee
PRO
0
19
脱SaaS脳 キャリア25年目の挑戦
freee
PRO
0
19
攻めと守りを両立するデータ基盤 〜中央集権型からデータメッシュへの道のり〜
freee
PRO
0
11
セキュリティチームのAIエージェントを チーム内の誰でも改善できるようにするまで
freee
PRO
0
14
AI Readyな安定性の高いデータ基盤を目指し、120個のデータコントラクトを結んだ話
freee
PRO
0
24
Other Decks in Technology
See All in Technology
スプシの手作業からの解脱 ~更新はClaude Codeに、見せ方と使い方はGASアプリに任せる~
kentarofujii
0
160
Conditional PED-ANOVA: Hyperparameter Importance in Hierarchical & Dynamic Search Spaces
pfn
PRO
0
140
アウトプット初心者、半年間のふりかえり
4o1sobblue
0
440
スキマバイトという雇用形態は存在しないので、雇用期間1日のアルバイト契約を事業者とワーカーが結ぶ手続きを支えるのがタイミーなんです
akitoshiga
0
210
宣言型部分更新は何を解決しどこへ向かうのか
shuta13
1
470
USB PDを使ってスマホを労わりたい
raspython3
0
180
Tofu-Controller lightning talk @ Containerday 2026
gionn
0
120
AI コーディングと人間の認知スループット / CTO Night & Day 2026 Morning Session / AI Coding and Human Cognitive Throughput
prog893
5
1.3k
Classmethod Company Deck
satoshi7
1
730
DevelopersIO 2026 知識の地図を描く ─ オントロジーとは何か?
ishikawa_satoru
1
1.7k
「Docker Desktop不要の時代」は 来たのか?
ueponx
0
830
10年後、Engineering 行為を剥奪されるとして、わたしたちは、どう、何を創ればいいだろうか。 / If Engineering Is Taken Away in 10 Years, How and What Should We Create?
bitkey
PRO
1
200
Featured
See All Featured
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
4
4.4k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.6k
Building Flexible Design Systems
yeseniaperezcruz
330
41k
Side Projects
sachag
456
43k
Producing Creativity
orderedlist
PRO
348
41k
YesSQL, Process and Tooling at Scale
rocio
174
15k
Making Projects Easy
brettharned
120
6.8k
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
600
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.4k
Product Roadmaps are Hard
iamctodd
55
13k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
3.2k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
35
2.9k
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 • νϡʔχϯάద࣮ٓࢪ͠·͠ΐ͏ • ϚελʔσʔλͱͷڞଘՄೳͳݶΓආ͚·͠ΐ͏ • ߏͷݟ͠ૣΊʹ͠·͠ΐ͏ ·ͱΊ
εϞʔϧϏδωεΛɺ ੈքͷओʹɻ