Upgrade to Pro — share decks privately, control downloads, hide ads and more …

実践ハイパフォーマンスMySQL読書会 第1回資料

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

実践ハイパフォーマンスMySQL読書会 第1回資料

Avatar for S.Nishio

S.Nishio

May 22, 2014
Tweet

More Decks by S.Nishio

Other Decks in Education

Transcript

  1. ষͷ֓ཁ •  MySQLΛ࠷େݶʹ׆༻͢ΔͨΊʹ –  MySQLͷઃܭΛཧղ͢Δࣄ͕ॏཁ  •  MySQLαʔόΞʔΩςΫνϟΛ၆ᛌతʹଊ͑Δ –  ετϨʔδΤϯδϯ͝ͱͷҧ͍͸Կ͔?

      –  ͦ͏ͨ͠ҧ͍͕ͳͥॏཁͳͷ͔?    •  MySQLྺ࢙తͳഎܠͱϕϯνϚʔΫʹ͍ͭͯ 2014/05/22   ࣮ફϋΠύϑΥʔϚϯεMySQLಡॻձ@  TIMࣾ಺   2  /  27  
  2. .Z42-ͷ࿦ཧΞʔΩςΫνϟ 2014/05/22   ࣮ફϋΠύϑΥʔϚϯεMySQLಡॻձ@  TIMࣾ಺   3  /  27  

    ઀ଓ  /  εϨουॲཧ ΫΤϦ Ωϟογϡ ύʔαʔ ΦϓςΟϚΠβ ΫϥΠΞϯτ ετϨʔδΤϯδϯ MySQLಛ༗ͷ΋ͷͰ͸ͳ͍αʔϏεؚΉ ઀ଓॲཧɺೝূɺηΩϡϦςΟ౳ MySQLͷத਻෦ ΫΤϦղੳɺ෼ੳɺ࠷దԽɺΩϟογϡɺ ૊ΈࠐΈؔ਺(೔෇ɺ࣌ؒɺࢉज़ԋࢉɺ ҉߸Խ౳)  ͷίʔυؚ͕·ΕΔ ετΞυɺτϦΨɺϏϡʔ΋͜ͷϨϕϧ ʹଐ͍ͯ͠Δ MySQLʹ֨ೲ͞ΕΔ͢΂ͯͷσʔλ อଘɺऔಘΛड͚࣋ͭ αʔό͸ετϨʔδΤϯδϯAPIΛ௨͡ ͯ΍ΓͱΓΛ͢Δ ϨΠϠ1 ϨΠϠ2 ϨΠϠ3
  3. ฒߦੑͷ੍ޚ •  αʔόϨϕϧͱετϨʔδΤϯδϯϨϕϧͷೋͭͰ ੍ޚ͢Δඞཁ͋Γ –  ฒߦੑͷ੍ޚ͸ॏཁͳςʔϚ͕ͩɺৄࡉ͸औΓ্͛ͳ͍ •  ϩοΫ –  ಡΈऔΓϩοΫ(ڞ༗ϩοΫ)

      –  ॻ͖ࠐΈϩοΫ(ഉଞϩοΫ)    •  ϩοΫͷཻ౓ –  ςʔϒϧϩοΫ   •  ΋ͬͱ΋Φʔόʔϔου͕௿͍  –  ߦϩοΫ •  ฒߦੑ͕࠷΋ߴ͘ɺΦʔόʔϔου΋࠷΋ߴ͍ •  αʔόͰͳ͘ετϨʔδΤϯδϯͰ࣮૷͞Ε͍ͯΔ –  InnoDB΍XtraDBͳͲͷετϨʔδΤϯδϯͰར༻Մೳ 2014/05/22   ࣮ફϋΠύϑΥʔϚϯεMySQLಡॻձ@  TIMࣾ಺   4  /  27   ಡΈऔΓ׬ྃ·ͰσʔλΛมߋ͠ͳ͍ͰͶ ϑϥάΛཱͯΔ Ϧιʔεͷಉ࣌ߋ৽Λ๷͙ͨΊͷϩοΫ
  4. τϥϯβΫγϣϯ"$*% •  ΞτϛοΫੑ(Atomicity)   –  All  or  nothing    

    –  τϥϯβΫγϣϯશମͷॲཧ͕͢΂ͯ׬ྃ͢Δ͔/͠ͳ͍͔  •  Ұ؏ੑ  (Consistency)   –  Ұ؏ͨ͠ঢ়ଶ͔ΒҰ؏ͨ͠ঢ়ଶ΁ͷભҠͱͳΔ͜ͱ •  τϥϯβΫγϣϯ్தͰΫϥογϡͯ͠΋ɺDB΁ͷมߋ͕ແ͍͜ͱ  •  ෼཭ੑ(Isolation)   –  τϥϯβΫγϣϯ్த݁Ռ͸ଞτϥϯβΫγϣϯ͔Βݟ͑ͳ͍͜ͱ  •  Ӭଓੑ(Durability)   –  ίϛοτ͞ΕͨτϥϯβΫγϣϯͷมߋ͸֬ఆ͞ΕΔ͜ͱ   2014/05/22   ࣮ફϋΠύϑΥʔϚϯεMySQLಡॻձ@  TIMࣾ಺   5  /  27  
  5. ෼཭Ϩϕϧ •  ෼཭ੑͷϨϕϧΛઃఆͰ͖Δ –  Ϩϕϧ͕௿͍΄Ͳฒߦੑ͕ߴ͘ͳΓΦʔόʔϔου͕ݮΔ •  READ  UNCOMMITTED   – 

    ίϛοτ͞Ε͍ͯͳ͍τϥϯβΫγϣϯͷ݁Ռ͕ଞτϥϯβ Ϋγϣϯ͔Βݟ͑Δ •  READ  COMMITTED  (ଟ͘ͷDBͷσϑΥϧτ)   –  ৗʹ࠷৽ͷίϛοτࡁΈσʔλΛಡΈऔΔ   •  REPEATABLE  READ  (MySQLσϑΥϧτ)   –  τϥϯβΫγϣϯ࣮ߦதɺಡΈऔΓର৅ͷσʔλ͕ ଞτϥϯβΫγϣϯʹΑͬͯมߋ͞Εͳ͍ •  SERIALIZABLE   –  ϊϯϦϐʔλϒϧϦʔυɺϑΝϯτϜϦʔυ౳ͷ໰୊͕ ൃੜ͠ͳ͍ –  σʔλͷ҆ఆੑ͸֬อ͞ΕΔ͕ɺฒߦੑ͸௿Լ   2014/05/22   ࣮ફϋΠύϑΥʔϚϯεMySQLಡॻձ@  TIMࣾ಺   6  /  27   Ϩϕϧߴ Ϩϕϧ௿
  6. 3&"%$0..*55&%ͷ໰୊ •  ϊϯϦϐʔλϒϧϦʔυ  /  ϑΝϯτϜϦʔυ͕ൃੜ •  ϊϯϦϐʔλϒϧϦʔυͱ͸? 2014/05/22   ࣮ફϋΠύϑΥʔϚϯεMySQLಡॻձ@

     TIMࣾ಺   7  /  27   Transaction  A  Start;     1.  A  ͞Μͷ࢒ߴΛSELECT  (100ԁ)   3.  A͞Μͷ࢒ߴΛ200ԁʹ͢Δ   5.  COMMIT; Transaction  B  Start;     2.  A  ͞Μͷ࢒ߴΛSELECT  (100ԁ)     4.  A͞Μͷ࢒ߴΛSELECT  (100ԁ)   6.  A͞Μͷ࢒ߴΛSELECT  (200ԁ!!)   7.  COMMIT; ৗʹίϛοτࡁΈͷ࠷৽σʔλΛ ಡΈऔΔͨΊൃੜ
  7. 3&1&"5"#-&3&"%ͷ໰୊ •  ϑΝϯτϜϦʔυ͕ൃੜ     –  ˞  MySQLͰ͸ʢผͷ࢓૊ΈʹΑΓʣϑΝϯτϜϦʔυ͸ൃੜ͠ͳ͍ •  ϑΝϯτϜϦʔυͱ͸?

    2014/05/22   ࣮ફϋΠύϑΥʔϚϯεMySQLಡॻձ@  TIMࣾ಺   8  /  27   Transaction  A  Start;     1.  Select  *  from  users;  (A͞Μ)   3.    UsersςʔϒϧʹB͞Μ௥Ճ    5.  COMMIT; Transaction  B  Start;     2.  Select  *  from  users;  (A͞Μ)     4.  Select  *  from  users;  (A͞Μ)   6.    Select  *  from  users;                (A͞ΜɺB͞Μ)   ͖ͬ͞·Ͱ͍ͳ͔ͬͨB͞Μ͕ ಥવݱΕͨ
  8. "/4*42-෼཭Ϩϕϧ 2014/05/22   ࣮ફϋΠύϑΥʔϚϯεMySQLಡॻձ@  TIMࣾ಺   9  /  27  

    ෼཭Ϩϕϧ μʔςΟʔ Ϧʔυ ϊϯϦϐʔλ ϒϧϦʔυ ϑΝϯτϜ Ϧʔυ ಡΈऔΓϩο Ϋ READ  UNCOMMITTED YES YES YES NO READ  COMMITTED NO YES YES NO REPEATABLE  READ NO NO YES NO SERIARIZABLE NO NO NO YES
  9. σουϩοΫ 2014/05/22   ࣮ફϋΠύϑΥʔϚϯεMySQLಡॻձ@  TIMࣾ಺   10  /  27  

    A͞Μͷ༬ۚ B͞Μͷ༬ۚ Transaction   A Transaction   B ߋ৽͢ΔͨΊϩοΫ ղআ଴ͪ ߋ৽͢ΔͨΊϩοΫ ղআ଴ͪ Transaction  A/B  ͸  A,  B͞Μͷ༬ۚ৘ใΛߋ৽͍ͨ͠
  10. ςʔϒϧΛ௚઀ߋ৽͢Δͱ ϥϯμϜI/O͕ൃੜ τϥϯβΫγϣϯϩά 2014/05/22   ࣮ફϋΠύϑΥʔϚϯεMySQLಡॻձ@  TIMࣾ಺   11  /

     27   ͜͜ͰΫϥογϡͯ͠΋ɺτϥϯβΫγϣϯϩά͔Β෮چՄೳ •  τϥϯβΫγϣϯޮ཰Խʹ໾ཱͭ •  τϥϯβΫγϣϯϩάΛ࢖ͬͨϩάઌߦॻ͖ࠐΈ 1.  σΟεΫ্ͷςʔϒϧΛߋ৽͢ΔͷͰ͸ͳ͘ɺϝϞϦ্ͷ ίϐʔΛมߋ͢Δ     •  ඇৗʹߴ଎ͳॻ͖ࠐΈ͕Մೳ   2.  ετϨʔδΤϯδϯ͸มߋه࿥ΛτϥϯβΫγϣϯϩάʹॻ͖ ࠐΉ •  σΟεΫ্ͷσʔλͳͷͰӬଓੑ͋Γ •  γʔέϯγϟϧͳI/O͕࢖༻͞ΕΔ  (ൺֱతߴ଎ʹߋ৽͞ΕΔ)       3.  λΠϛϯάΛݟܭΒͬͯɺσΟεΫ্ͷςʔϒϧΛߋ৽ มߋΛσΟεΫʹ2ճॻ͖ࠐΉ͜ͱʹͳΔ
  11. .Z42-ͷτϥϯβΫγϣϯ •  σϑΥϧτ͸AUTO  COMMIT   –  τϥϯβΫγϣϯΛ໌ࣔ͠ͳ͍ݶΓɺͦΕͧΕผͷ τϥϯβΫγϣϯͱ࣮ͯ͠ߦ͞ΕΔ  • 

    ෳ਺ετϨʔδΤϯδϯͷซ༻ –  τϥϯβΫγϣϯ͸αʔόϨϕϧͰ؅ཧͤͣɺ࣮૷͸ ετϨʔδΤϯδϯʹ͞Ε͍ͯΔ –  ෳ਺ΤϯδϯؒͰ1ͭͷτϥϯβΫγϣϯΛுΔࣄ͸ෆՄೳ •  ҉໧తͳϩοΫͱ໌ࣔతͳϩοΫ –  InnoDB͸2૬ͷϩοΫϓϩτίϧΛར༻ •  τϥϯβΫγϣϯத͸͍ͭͰ΋ϩοΫऔಘՄೳ͕ͩɺCOMMIT,   ROLLBACK͢Δ·Ͱղ๏͞Εͳ͍ •  ϩοΫ͸͢΂ͯͷϩοΫΛಉ࣌ʹղ์͢Δ –  ໌ࣔతͳϩοΫ  (  SELECT  …  FOR  UPDATE౳) 2014/05/22   ࣮ફϋΠύϑΥʔϚϯεMySQLಡॻձ@  TIMࣾ಺   12  /  27  
  12. Ϛϧνόʔδϣϯͷฒߦੑ੍ޚ .7$$  •  MySQLͷετϨʔδΤϯδϯͷ΄ͱΜͲ͸ߦϩοΫΛ ࢖Θͳ͍  •  ߦϩοΫͱMVCCΛ૊Έ߹Θͤͯ࢖༻͍ͯ͠Δ – 

    MVCC͸Oracle,  PostgreSQL  ͳͲͰ΋࣮૷͞Ε͍ͯΔ  •  MVCC͸REPEATABLE  READ,  READ  COMMITTEDʹͷΈରԠ •  MySQL  REPEATABLE  READͰϑΝϯτϜϦʔυ͕ൃੜ͠ͳ ͍ͷ͸ɺMVCCͷ͓͔͛ 2014/05/22   ࣮ફϋΠύϑΥʔϚϯεMySQLಡॻձ@  TIMࣾ಺   13  /  27  
  13. .7$$ͱ͸  •  MVCCΛ࢖͏ͱɺෳ਺τϥϯβΫγϣϯ͕ಉ͡ςʔϒϧ ಺ͷҟͳΔσʔλΛಉ࣌ʹࢀরͰ͖Δ   •  InnoDBͰ͸ɺߦ͝ͱʹӅΕͨೋͭͷ஋Λ֨ೲ –  ߦ͕࡞੒͞ΕͨλΠϛϯά

    –  ߦ͕ظݶ੾Ε(࡟আ͞ΕͨʣλΠϛϯά  •  ্هʹೖΕΔ஋͸ɺ֤Πϕϯτ͕ൃੜͨ࣌͠ͷγεςϜ όʔδϣϯ൪߸ –  τϥϯβΫγϣϯ͕։࢝͞ΕΔͨͼʹ൪߸͸ΠϯΫϦϝϯτ͞ ΕΔ –  ΫΤϦ͸ͦΕͧΕ֤ߦͷόʔδϣϯ൪߸ΛτϥϯβΫγϣϯͷ όʔδϣϯͱൺֱ͢Δඞཁ͕͋Δ 2014/05/22   ࣮ફϋΠύϑΥʔϚϯεMySQLಡॻձ@  TIMࣾ಺   14  /  27  
  14. .7$$ͱ͸r*OTFSU࣌ 2014/05/22   ࣮ફϋΠύϑΥʔϚϯεMySQLಡॻձ@  TIMࣾ಺   15  /  27  

    ߦA ߦB ߦC -­‐ 1 1 1 ௥Ճόʔδϣϯ ࡟আόʔδϣϯ -­‐ -­‐ ߦD 2 -­‐ τϥϯβΫγϣϯA  (version:  2)  ͕σʔλD  Λ௥Ճ Trn A InnoDB͸ݱࡏͷγεςϜ όʔδϣϯ൪߸(2)   Λ৽͍͠ߦʹه࿥͢Δ
  15. .7$$ͱ͸r6QEBUF࣌ 2014/05/22   ࣮ફϋΠύϑΥʔϚϯεMySQLಡॻձ@  TIMࣾ಺   16  /  27  

    ߦA ߦB ߦC -­‐ 1 1 1 ௥Ճόʔδϣϯ ࡟আόʔδϣϯ -­‐ -­‐ ߦD2 3 -­‐ τϥϯβΫγϣϯA  (version:  3)  ͕σʔλD  Λमਖ਼ ʢσʔλΛߦD͔ΒߦD2  ʹߋ৽) Trn A ৽͍͠ߦͷόʔδϣϯʹରԠ͢Δ γεςϜόʔδϣϯ൪߸Λ࢖ͬͯɺ ߦͷ৽͍͠ίϐʔΛॻ͖ग़͢  ݹ͍ߦͷ࡟আόʔδϣϯͱͯ͠γ εςϜόʔδϣϯ൪߸Λॻ͖ग़͢ ߦD 2 3
  16. .7$$ͱ͸r4FMFDU࣌   2014/05/22   ࣮ફϋΠύϑΥʔϚϯεMySQLಡॻձ@  TIMࣾ಺   17  /

     27   ߦA ߦB ߦC -­‐ 1 1 1 ௥Ճόʔδϣϯ ࡟আόʔδϣϯ -­‐ -­‐ ߦD2 3 -­‐ τϥϯβΫγϣϯA  (version:  4)  ͕SELECT  *  from  table; Trn A 1.  τϥϯβΫγϣϯͱಉ͔͡ɺͦΕҎ લͷόʔδϣϯߦΛݕࡧ͠ͳ͚Ε͹ͳ Βͳ͍  2.  ࡟আόʔδϣϯ͸ະఆٛͰ͋Δ͔ɺ τϥϯβΫγϣϯͷόʔδϣϯΑΓ΋ ৽͍͠όʔδϣϯͰແ͚Ε͹ͳΒͳ͍  ্ه2ͭΛݟͨͨ͠σʔλΛฦ͢   ߦD 2 3 σʔλ͸ɺA,  B,  C,  D2  ͕ͱΕΔ
  17. .7$$ͱ͸r4FMFDU࣌   2014/05/22   ࣮ફϋΠύϑΥʔϚϯεMySQLಡॻձ@  TIMࣾ಺   18  /

     27   ߦA ߦB ߦC -­‐ 1 1 1 ௥Ճόʔδϣϯ ࡟আόʔδϣϯ -­‐ -­‐ ߦD2 3 -­‐ τϥϯβΫγϣϯA  (version:  2)  ͕SELECT  *  from  table;   Aͷ్தͰτϥϯβΫγϣϯB(version:3  )͕σʔλߋ৽,  COMMIT Trn A ߦD 2 3 σʔλ͸ɺA,  B,  C,  D  ͕ͱΕΔ Trn B ߦDΛߦD2ʹߋ৽ 1.  τϥϯβΫγϣϯͱಉ͔͡ɺͦΕҎલͷ όʔδϣϯߦΛݕࡧ͠ͳ͚Ε͹ͳΒͳ͍  2.  ࡟আόʔδϣϯ͸ະఆٛͰ͋Δ͔ɺτϥϯ βΫγϣϯͷόʔδϣϯΑΓ΋৽͍͠όʔ δϣϯͰແ͚Ε͹ͳΒͳ͍   ϊϯϦϐʔλϒϧϦʔυ͕ൃੜ͠ͳ͍!!
  18. .7$$ͱ͸r4FMFDU࣌   2014/05/22   ࣮ફϋΠύϑΥʔϚϯεMySQLಡॻձ@  TIMࣾ಺   19  /

     27   ߦA ߦB ߦC -­‐ 1 1 1 ௥Ճόʔδϣϯ ࡟আόʔδϣϯ -­‐ -­‐ τϥϯβΫγϣϯA  (version:  2)  ͕SELECT  *  from  table;   Aͷ్தͰτϥϯβΫγϣϯB(version:3  )͕σʔλInsert,  COMMIT Trn A ߦD 3 -­‐ σʔλ͸ɺA,  B,  C  ͕ͱΕΔ Trn B ߦDΛInsert 1.  τϥϯβΫγϣϯͱಉ͔͡ɺͦΕҎલͷ όʔδϣϯߦΛݕࡧ͠ͳ͚Ε͹ͳΒͳ͍  2.  ࡟আόʔδϣϯ͸ະఆٛͰ͋Δ͔ɺτϥϯ βΫγϣϯͷόʔδϣϯΑΓ΋৽͍͠όʔ δϣϯͰແ͚Ε͹ͳΒͳ͍   ϑΝϯτϜϦʔυ͕ൃੜ͠ͳ͍!!
  19. .Z42-ͷετϨʔδΤϯδϯ 2014/05/22   ࣮ફϋΠύϑΥʔϚϯεMySQLಡॻձ@  TIMࣾ಺   20  /  27  

    •  ֤σʔλϕʔεΛͦͷσʔλσΟϨΫτϦͷαϒσΟϨ ΫτϦͱͯ͠ϑΝΠϧγεςϜʹ֨ೲ •  ςʔϒϧ࡞੒ͷࡍɺ.frm֦ுࢠ͕͍ͭͨϑΝΠϧʹςʔ ϒϧఆٛΛอଘ •  ςʔϒϧʹؔ͢Δ৘ใ͸ɺSHOW  TABLE  STATUSͰ֬ೝ
  20. *OOP%#Τϯδϯ •  ྺ࢙͸লུ •  InnoDB֓ཁ –  MVCCΛ࢖͍ߴ͍ฒߦੑΛ࣮ݱɺ෼཭Ϩϕϧ΋શ࣮ͯ૷  –  σϑΥϧτͰ͸REPEATABLE

     READ෼཭Ϩϕϧ •  ϑΝϯτϜϦʔυΛ્ࢭ͢ΔωΫετΩʔϩοΫΛద༻  –  ςʔϒϧ͸ΫϥελԽΠϯσοΫεʹج͍ͮͯߏங͞ΕΔ •  ΫϥελԽΠϯσοΫε͸5ষʹͯͰͯ͘Δ •  ΠϯσοΫεʹσʔλ͕͍ͬͭͨ͘΋ͷ –  ηΧϯμϦΠϯσοΫεʹओΩʔؚ͕·ΕΔͷͰɺओΩʔ͕େ ͖͍৔߹͸ΠϯσοΫε͕େ͖͘ͳΔ 2014/05/22   ࣮ફϋΠύϑΥʔϚϯεMySQLಡॻձ@  TIMࣾ಺   22  /  27  
  21. .Z*4".Τϯδϯ •  શจΠϯσοΫεɺѹॖɺGISؔ਺౳Λఏڙ •  τϥϯβΫγϣϯ͸ߦϨϕϧͰ͸αϙʔτ͍ͯ͠ͳ͍ •  ΫϥογϡηʔϑͰ͸ͳ͍ •  χονͳχʔζΛຬͨͨ͢Ίͷػೳ͕৭ʑ͋ΔΒ͍͠ • 

    σʔλετϨʔδ͕ίϯύΫτɺ͔ͭγϯϓϧͰ Φʔόʔϔου͕গͳ͍ –  ༻్ʹΑͬͯ͸༏ΕͨύϑΥʔϚϯεΛୡ੒Ͱ͖Δ 2014/05/22   ࣮ફϋΠύϑΥʔϚϯεMySQLಡॻձ@  TIMࣾ಺   23  /  27  
  22. ͦͷଞͷ૊ΈࠐΈΤϯδϯ •  Archive   •  Blackhole   •  CSV  

    •  Federated   •  Memory   •  Merge   •  NDB  Cluster   ͳͲͳͲ 2014/05/22   ࣮ફϋΠύϑΥʔϚϯεMySQLಡॻձ@  TIMࣾ಺   24  /  27   ݸਓతͳײ૝  Blackhole࢖ͬͯΔਓ͍ͨΒ࿩͖͖͍ͨɺҰମԿʹ࢖͏ͷ͔?  
  23. ςʔϒϧͷม׵ •  ALTER  TABLEͰςʔϒϧม׵ –  >  ALTER  TABLE  mytable  ENGINE

     =  InnoDB;   –  ͜ͷίϚϯυ͸͕͔͔࣌ؒΔՄೳੑ͕͋Δ –  ετϨʔδΤϯδϯݻ༗ͷػೳ͸ফ͑Δ •  InnoDB  -­‐>  MyISAM  -­‐>  InnoDBͱม׵͢Δͱɺ࠷ॳʹఆٛ͞Ε͍ͯͨ  ֎෦Ωʔ͸͢΂ͯফ͑Δ •  MysqldumpͰม׵   –  μϯϓͯ͠ɺCREATE  TABLEΛௐઅ͢Δ  •  CREATE  SELECTͰม׵ –  >  CREATE  TABLE  innodb_table  LIKE  myisam_table;   –  >  ALTER  TABLE  innodb_table  ENGINE=InnoDB;   –  >  INSERT  INTO  innodb_table  SELECT  *  from  myisam_table; 2014/05/22   ࣮ફϋΠύϑΥʔϚϯεMySQLಡॻձ@  TIMࣾ಺   26  /  27