Share
Embed
Transcript
33 slides
-
takuya kubo @tkuboma ॴଐνʔϜʢࡶձܭ ਓؒνʔϜʣ 2 ܦྺ • Sierͱͯ͠ෳاۀΛసʑ ◦
ओʹ௨৴ܥͷόοΫΤϯυ • ࣄۀձࣾͰհޢٻιϑτͷ։ൃʹैࣄ ◦ ৽نɾอक։ൃɺࢢௐࠪɺίʔϧηϯλʔͳͲ • 20177݄ freee ʹ join ◦ ձܭνʔϜॴଐ ▪ ৽نɾอक։ൃ ◦ νʔϜࠈ ͔Β νʔϜਓؒ ▪ ਃυϝΠϯͷϚΠΫϩαʔϏεԽ ▪ ܾࢉυϝΠϯपลͷอक։ൃ झຯ • ͓ञ • ࢠڙ -
5 • Mackerel ◦ ֎ܗࢹɾαʔόʔϨϕϧͰࢹ ◦ Slackʹ௨ • NewRelic ◦
ΞϓϦέʔγϣϯͷੑೳࢹ ◦ ϘτϧωοΫͱͳ͍ͬͯΔ End-point ֬ೝ • Monyog ◦ queryϨϕϧͰࢹ ◦ ϝʔϧ௨ • Datadog (࠷ۙಋೖ࢝͠Ίͨ) ◦ KubernetesڥͷࢹʹɺΑΓదͳSaaSͱͯ͠ಋೖ freeeͷࢹपΓʹ͍ͭͯ؆୯ʹ -
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पΓͷύϑΥʔϚϯεվળ -
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पΓͷύϑΥʔϚϯεվળ -
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पΓͷύϑΥʔϚϯεվળ -
24 • ৽ͨͳൃੜ ◦ ొ࣌ͷύϑΥʔϚϯε ◦ ָ؍ϩοΫΤϥʔ ◦ ΪϟοϓϩοΫʹΑΔϩοΫͪ ◦
ϑΝϯτϜϦʔυʹΑΔσʔλෆ߹ • ରࡦ ◦ ूܭσʔλͷอଘΛผτϥϯβΫγϣϯͰඇಉظʹ ◦ ࣄۀॴɺूܭ୯ҐͱͳΔଐੑΛΩʔͱͯ͠ॲཧΛγϟʔσΟϯάͯ͠ɺಉͭ͡ྻʹ·ͱΊ࣮ͯߦ͢Δ ༁σʔλ ͷอଘ ूܭσʔλ ͷอଘ DBपΓͷύϑΥʔϚϯεվળ -
KinesisΛར༻ͨ͠ूܭςʔϒϧͷߋ৽ Kinesis Stream RDS ूܭ Server ձܭfreee Server 1. ݩσʔλUpdate
2. ूܭϦΫΤετQueuing 3. Polling 4. Data Fetch 5. ूܭσʔλUpdate DBपΓͷύϑΥʔϚϯεվળ -
26 • ҙ͍ͯ͠Δࣄ ◦ ूܭςʔϒϧͷσʔλͷΓํ ◦ ొ࣌ͷίετ૿ ◦ ूܭσʔλදࣔͷϦΞϧλΠϜੑΛଛͳ͏ͨΊϢʔβʔͷࠂͳͲ ◦
վળʹ͔ͳΓͷ͕͔͔࣌ؒΔ DBपΓͷύϑΥʔϚϯεվળ -
29 • ରԠ ◦ ϢʔβʔΞΫγϣϯϕʔεͰͷऔಘʹมߋ ◦ ඇಉظԽ • ҙ͍ͯ͠Δࣄ ◦
ϏδωεαΠυ(Ϣʔβʔ)ͱͷίϛϡχέʔγϣϯ ◦ ϢʔβʔϝϦοτͱӡ༻ίετʹ͍ͭͯ DBपΓͷύϑΥʔϚϯεվળ -
30 • slave ◦ Өڹͳ͍selectܥslave ◦ write͕ଟ͍αʔϏε replication latency ʹҙ
• N + 1ͷղফ ◦ bullet ͷಋೖ • ݕࡧ෦ͷ Elasticsearch Խ ◦ େྔσʔλͷ݅ݕࡧ࣌ ◦ ᐆດݕࡧ࣌ • γϟʔσΟϯάͷݕ౼ DBपΓͷύϑΥʔϚϯεվળ