WebエンジニアのためのMySQLデータ構造基礎 / mysql data structure for web developer

C0e58802a4228552548bb8ca596ca966?s=47 Mihyaeru
October 11, 2017

WebエンジニアのためのMySQLデータ構造基礎 / mysql data structure for web developer

C0e58802a4228552548bb8ca596ca966?s=128

Mihyaeru

October 11, 2017
Tweet

Transcript

  1. WebΤϯδχΞͷͨΊͷ
 MySQLσʔλߏ଄جૅ 2017-10-11 αϙʔλʔζ CoLab @mihyaeru21

  2. ࣗݾ঺հ • ϛώϟΤϧ @mihyaeru21 • ৬ྺ • 2014-04 גࣜձࣾϞόΠϧϑΝΫτϦʔ •

    αϙʔλʔζܦ༝ • Ґஔ৘ใήʔϜ x 3 • 2016-10 freeeגࣜձࣾ • ձܭαʔϏε • ػೳ։ൃͱ͔ύϑΥʔϚϯενϡʔχϯάͱ͔ • ओʹαʔόʔαΠυͰΫϥΠΞϯτ΋΍Δ
  3. ͳͥ஌Δඞཁ͕͋Δͷ͔ • Web։ൃͰ͸ORMΛ࢖͏͜ͱ͕ଟ͍ʢͨͿΜʣ • ORM͸͍Ζ͍Ζͱศར • ൓໘... • ͲΜͳΫΤϦʹͳΔͷ͔Θ͔Γʹ͍͘৔߹͋Γ •

    ࣮ଶ͕DBͰɺSQLΛ࣮ߦ͍ͯ͠Δҙ͕ࣝബΕ͕ͪ • ࣮ଶΛҙࣝ͠ͳ͍ͱ... • ਂࠁͳύϑΥʔϚϯε໰୊ͷՄೳੑ • DBಛ༗ͷڍಈͰϋϚΔ
  4. ͱ͍͏Θ͚ͰMySQLʹ͍ͭͯ

  5. ର৅ऀ • Web։ൃΛ΍ͬͯΔ • ΠϯσοΫε͸஌ͬͯΔ͠࢖͑Δ • ͱ͸͍͑งғؾͰDB·ΘΓΛѻ͍ͬͯΔ • (࣮ફϋΠύϑΥʔϚϯεMySQLͱ͔ΛͪΌΜͱಡΜͩ ͜ͱ͕͋ΔͳΒฉ͘ඞཁ͕·ͬͨ͘ͳ͍Ͱ͢)

  6. ͬ͘͟Γͨ͠໨࣍ • MySQLͷΞʔΩςΫνϟ • ςʔϒϧ΍ΠϯσοΫεͷσʔλߏ଄ • ύϑΥʔϚϯεʹؔ܎͢Δ࿩ • ڍಈʹؔ܎͢Δ࿩

  7. MySQLͷΞʔΩςΫνϟ αʔόʔ ετϨʔδΤϯδϯ ετϨʔδΤϯδϯAPI ΫϥΠΞϯτͱͷ઀ଓ ※͜ͷࢿྉʹ͓͍ͯαʔόʔͱಡΜͰ͍Δ෦෼͸MySQLͷαʔόʔͷ͏ͪɺετϨʔδΤϯδϯͰͳ͍෦෼ͷ૯শͰ͢ɻ ͏·͍૯শ͕ͳ͍ͷͰɺ࣮ફϋΠύϑΥʔϚϯεMySQLʹशͬͯαʔόʔͱݺͿ͜ͱʹ͠·͢ɻ

  8. αʔόʔ αʔόʔ ετϨʔδΤϯδϯ • ӬଓԽʹؔΘΔ෦෼Ҏ֎ • ΫΤϦͷղੳ • ࠷దԽ •

    ࣮ߦ • ΫΤϦΩϟογϡ • ઀ଓॲཧ • etc...
  9. αʔόʔ ετϨʔδΤϯδϯ ετϨʔδΤϯδϯ • σʔλͷӬଓԽΛ࢘Δ • ΠϯσοΫε • τϥϯβΫγϣϯ •

    ετϨʔδΤϯδϯAPI • ετϨʔδΤϯδϯ͸໨తʹԠͯ͡
 બͿ͜ͱ͕Ͱ͖Δ
  10. ༷ʑͳετϨʔδΤϯδϯ • InnoDB • MyISAM • MEMORY • CSV •

    BLACKHOLE • MyRocks • etc... (see https://dev.mysql.com/doc/refman/5.6/ja/storage-engines.html )
  11. InnoDB • MySQL 5.5Ҏ߱ͷσϑΥϧτ • τϥϯβΫγϣϯ͕࢖͑Δ • ֎෦Ωʔ੍໿͕࢖͑Δ • ଞͷετϨʔδΤϯδϯΛ࢖͏ඞવੑΛઆ໌Ͱ͖ͳ͍

    ͳΒ͜ΕΛ࢖͑͹OK • ͜ͷޙͷ࿩͸InnoDBʹ͍ͭͯͷ࿩
  12. MyISAM • MySQL 5.5ΑΓલͷσϑΥϧτ • ۭؒΠϯσοΫε͕࢖͑Δ • (InnoDBͰ΋5.7.5Ҏ߱ͳΒ࢖͑Δ) • τϥϯβΫγϣϯ͕࢖͑ͳ͍

    • ςʔϒϧ୯ҐͰ͔͠ϩοΫͰ͖ͳ͍
  13. ͦͷଞ • MEMORY • ϝϞϦ಺ͷΈɻফ͑ͯ΋໰୊ͳ͍σʔλ͚ͩ • CSV • CSVϑΝΠϧʹอଘ͞ΕΔ •

    BLACKHOLE • Կ΋อଘ͠ͳ͍ʢʁʂʣ • MyRocks • Facebook͕InnoDBͰਏ͘ͳͬͯ࡞ͬͨ΍ͭ • লσΟεΫεϖʔεɺߴॻ͖ࠐΈੑೳ
  14. ※Ҏ߱͸InnoDBʹ͍ͭͯͷ࿩Ͱ͢

  15. ςʔϒϧͷσʔλߏ଄ • ࿦ཧతͳσʔλߏ଄͸୯७ͳϋογϡͷ഑ྻͰ͸ͳ͍ < \JE OBNF෨^  \JE OBNFߴ໺^ 

    \JE OBNFాத^   >
  16. ςʔϒϧͷσʔλߏ଄ • ࿦ཧతͳσʔλߏ଄͸୯७ͳϋογϡͷ഑ྻͰ͸ͳ͍ < \JE OBNF෨^  \JE OBNFߴ໺^ 

    \JE OBNFాத^   >
  17. ٸ͕͹ճΕ • ઌʹΠϯσοΫεͷσʔλߏ଄ • InnoDBͷσϑΥϧτͰ͸B+໦ͱ͍͏σʔλߏ଄ ※Ҏ߱ɺΠϯσοΫε͸B+໦લఏͷ࿩Ͱ͢

  18. B໦ • ͞ΒʹճΓಓ • B+໦ͷલʹB໦ʢ໊લ͔Β࡯͍ͯͩ͘͠͞ʣ • ໦ߏ଄ • ฏߧ໦

  19. B໦ 8 13 2 2 3 3 6 6 8

    8 9 9 15 15 10 10 20 20 28 28
  20. B໦ 8 13 2 2 3 3 6 6 8

    8 9 9 15 15 10 10 20 20 28 28 ϊʔυ ※Ϧʔϑϊʔυͷදݱํ๏͸͍͔ͭ͋͘Γ·͢ ※͜ͷਤͰ͸Լଆͷ3͕ͭϦʔϑϊʔυʹͳΓ·͢
  21. B໦ 8 13 2 2 3 3 6 6 8

    8 9 9 15 15 10 10 20 20 28 28 Ωʔ
  22. B໦ 8 13 2 2 3 3 6 6 8

    8 9 9 15 15 10 10 20 20 28 28 ϊʔυΛࢦ͢ϙΠϯλ
  23. B໦ 8 13 2 2 3 3 6 6 8

    8 9 9 15 15 10 10 20 20 28 28 ֨ೲ͞ΕΔ஋
  24. B໦: ݕࡧ 8 13 2 2 3 3 6 6

    8 8 9 9 15 15 10 10 20 20 28 28 ݕࡧ஋x͕9
  25. B໦: ݕࡧ 8 13 2 2 3 3 6 6

    8 8 9 9 15 15 10 10 20 20 28 28 8 ≦ x < 13 ݕࡧ஋x͕9
  26. B໦: ݕࡧ 8 13 2 2 3 3 6 6

    8 8 9 9 15 15 10 10 20 20 28 28 ݕࡧ஋x͕9 8 ≦ x < 13 x = 9
  27. B໦: ݕࡧ 8 13 2 2 3 3 6 6

    8 8 9 9 15 15 10 10 20 20 28 28 ݕࡧ஋x͕9 8 ≦ x < 13 x = 9
  28. B+໦ 8 13 2 2 3 3 6 6 8

    8 9 9 10 10 15 15 20 20 28 28
  29. B+໦ 8 13 2 2 3 3 6 6 8

    8 9 9 10 10 15 15 20 20 28 28 Ϧʔϑϊʔυͷ຤ඌ͕࣍ͷϦʔϑϊʔυΛࢦ͢
  30. B+໦ 8 13 2 2 3 3 6 6 8

    8 9 9 10 10 15 15 20 20 28 28 ιʔτࡁΈͷ஋Λૉૣ͘ಡΈऔΕΔ
  31. ΠϯσοΫε • σϑΥϧτͰ͸B+໦ͷߏ଄Ͱσʔλ͕֨ೲ͞ΕΔ

  32. ΠϯσοΫε 8 13 2 3 6 8 9 10 15

    20 28
  33. ΠϯσοΫε ʁʁʁ 8 13 2 3 6 8 9 10

    15 20 28
  34. ΠϯσοΫε ओΩʔ͕ೖΔ 8 13 2 4 3 8 6 7

    8 1 9 6 10 2 15 5 20 3 28 9
  35. ηΧϯμϦΠϯσοΫε 8 13 2 4 3 8 6 7 8

    1 9 6 10 2 15 5 20 3 28 9 • ओΩʔҎ֎ͷΠϯσοΫε͸ࠓઆ໌ͨ͠ߏ଄ • ηΧϯμϦΠϯσοΫεͱݺͿ
  36. ςʔϒϧͷσʔλߏ଄ • ΍ͬͱؼ͖ͬͯ·ͨ͠

  37. ςʔϒϧͷσʔλߏ଄ 4 7 1 2 ্ా 4/29 10 3 ࡾӜ

    7/5 8 ໊લ ஀ੜ೔ ฒͼॱ ্໺ 1/8 20 4 5 தౡ 1/16 15 6 தࢁ 12/27 2 த઒ 2/2 9 7 8 த໺ 3/13 3 9 தଜ 11/25 6 Ճ౻ 9/23 28
  38. ςʔϒϧͷσʔλߏ଄ 4 7 1 2 ্ా 4/29 10 3 ࡾӜ

    7/5 8 ໊લ ஀ੜ೔ ฒͼॱ ্໺ 1/8 20 4 5 தౡ 1/16 15 6 தࢁ 12/27 2 த઒ 2/2 9 7 8 த໺ 3/13 3 9 தଜ 11/25 6 Ճ౻ 9/23 28 B+໦ͷߏ଄ͦͷ·· Ϧʔϑϊʔυʹ࣮σʔλ͕ೖ͍ͬͯΔ
  39. ςʔϒϧͷσʔλߏ଄ 4 7 1 2 ্ా 4/29 10 3 ࡾӜ

    7/5 8 ໊લ ஀ੜ೔ ฒͼॱ ্໺ 1/8 20 4 5 தౡ 1/16 15 6 தࢁ 12/27 2 த઒ 2/2 9 7 8 த໺ 3/13 3 9 தଜ 11/25 6 Ճ౻ 9/23 28 • ओΩʔͰΫϥελԽ͞Ε͍ͯΔ • ΫϥελԽΠϯσοΫε
  40. ηΧϯμϦΠϯσοΫεΛ࢖ͬͨݕࡧ 8 13 2 4 3 8 6 7 8

    1 9 6 10 2 15 5 20 3 28 9 select * from users where ฒͼॱ = 10;
  41. ηΧϯμϦΠϯσοΫεΛ࢖ͬͨݕࡧ 8 13 2 4 3 8 6 7 8

    1 9 6 10 2 15 5 20 3 28 9 ฒͼॱ = 10
  42. ηΧϯμϦΠϯσοΫεΛ࢖ͬͨݕࡧ 8 13 2 4 3 8 6 7 8

    1 9 6 10 2 15 5 20 3 28 9 ฒͼॱ = 10 ओΩʔ = 2
  43. ηΧϯμϦΠϯσοΫεΛ࢖ͬͨݕࡧ 8 13 2 4 3 8 6 7 8

    1 9 6 10 2 15 5 20 3 28 9 ฒͼॱ = 10 4 7 1 2 ্ా 4/29 10 3 ࡾӜ 7/5 8 ໊લ ஀ੜ೔ ฒͼॱ ্໺ 1/8 20 4 5 தౡ 1/16 15 6 தࢁ 12/27 2 த઒ 2/2 9 7 8 த໺ 3/13 3 9 தଜ 11/25 6 Ճ౻ 9/23 28
  44. ηΧϯμϦΠϯσοΫεΛ࢖ͬͨݕࡧ 8 13 2 4 3 8 6 7 8

    1 9 6 10 2 15 5 20 3 28 9 ฒͼॱ = 10 4 7 1 2 ্ా 4/29 10 3 ࡾӜ 7/5 8 ໊લ ஀ੜ೔ ฒͼॱ ্໺ 1/8 20 4 5 தౡ 1/16 15 6 தࢁ 12/27 2 த઒ 2/2 9 7 8 த໺ 3/13 3 9 தଜ 11/25 6 Ճ౻ 9/23 28
  45. Ҏ্͕جຊతͳߏ଄ͷ࿩

  46. ͬ͘͟Γͨ͠໨࣍ • MySQLͷΞʔΩςΫνϟ • ςʔϒϧ΍ΠϯσοΫεͷσʔλߏ଄ • ύϑΥʔϚϯεʹؔ܎͢Δ࿩ • ڍಈʹؔ܎͢Δ࿩

  47. ύϑΥʔϚϯεʹؔ܎͢Δ࿩ • ΠϯσοΫε͕࢖͑ͳ͍ͱͲ͏ͳΔͷ͔ • ΠϯσοΫε͸ࠨ͔Βӈ • ෳ߹ΠϯσοΫε • NOTͷѻ͍ •

    NULLͷѻ͍ • ιʔτ • ΧόϦϯάΠϯσοΫε
  48. ςʔϒϧ • id • ໊લ • ஀ੜ೔ • ݂ӷܕ •

    ฒͼॱʢ͖ͯͱʔͳ਺ࣈʣ • ి࿩൪߸ʢNULLͷ৔߹͋Γʣ • 100ສߦ
  49. ΠϯσοΫε͕࢖͑ͳ͍ͱͲ͏ͳΔͷ͔ • ετϨʔδΤϯδϯ͕100ສ݅શ݅Λ
 ϝϞϦ಺ʢόοϑΝϓʔϧʣ΋͘͠͸ ετϨʔδ͔ΒಡΈऔΔʢʂʂʂʣ αʔόʔ ετϨʔδΤϯδϯ όοϑΝϓʔϧ ετϨʔδ ສ݅

    ਏ͍
  50. ΠϯσοΫε͕࢖͑ͳ͍ͱͲ͏ͳΔͷ͔ • ετϨʔδΤϯδϯ͔Βαʔόʔ΁ αʔόʔ ετϨʔδΤϯδϯ όοϑΝϓʔϧ ετϨʔδ ສ݅ ਏ͍

  51. ΠϯσοΫε͕࢖͑ͳ͍ͱͲ͏ͳΔͷ͔ • 100ສߦΛݟ͍ͯͬͯɺWHERE۟ͷ৚ ݅ʹҾ͔͔ͬΒͳ͍ߦΛࣺͯΔ αʔόʔ ετϨʔδΤϯδϯ όοϑΝϓʔϧ ετϨʔδ ໊લΧϥϜ͕ʮՃ౻ʯʁ໊લΧϥϜ͕ʮՃ ౻ʯʁ໊લΧϥϜ͕ʮՃ౻ʯʁ໊લΧϥϜ͕

    ʮՃ౻ʯʁ໊લΧϥϜ͕ʮՃ౻ʯʁ໊લΧϥ Ϝ͕ʮՃ౻ʯʁ໊લΧϥϜ͕ʮՃ౻ʯʁ໊લ ΧϥϜ͕ʮՃ౻ʯʁ໊લΧϥϜ͕ʮՃ౻ʯʁ ໊લΧϥϜ͕ʮՃ౻ʯʁ໊લΧϥϜ͕ʮՃ ౻ʯʁ໊લΧϥϜ͕ʮՃ౻ʯʁ໊લΧϥϜ͕ ʮՃ౻ʯʁ໊લΧϥϜ͕ʮՃ౻ʯʁ໊લΧʜ
  52. ΠϯσοΫε͕࢖͑ͳ͍ͱͲ͏ͳΔͷ͔ • ࢒ͬͨ5݅ΛΫϥΠΞϯτʹฦ ͢ αʔόʔ ετϨʔδΤϯδϯ όοϑΝϓʔϧ ετϨʔδ ݅͋Γ·ͨ͠ʂʂʂ ΫϥΠΞϯτ

  53. ΠϯσοΫε͕࢖͑ͳ͍ͱͲ͏ͳΔͷ͔ αʔόʔ ετϨʔδΤϯδϯ όοϑΝϓʔϧ ετϨʔδ Զͨͪ͸ԿͷͨΊʹ ຾Γ͔Βݺͼ֮·͞Εͨͷ͔ ΫϥΠΞϯτ ࣺͯΒΕͨ ݅

  54. ΠϯσοΫε͕࢖͑ΔͱͲ͏ͳΔͷ͔ • ΠϯσοΫεΛݟΔͱ5͚݅ͩಡΈࠐ Ί͹ྑ͍͜ͱ͕Θ͔Δ • ͜ͷ5݅͸O(log n)Ͱݟ͔ͭΔ αʔόʔ ετϨʔδΤϯδϯ όοϑΝϓʔϧ

    ετϨʔδ ໊લΧϥϜ͕ʮՃ౻ʯ
 Ͱ͋Δ͚݅ͩ
  55. ΠϯσοΫε͕࢖͑ΔͱͲ͏ͳΔͷ͔ • ετϨʔδΤϯδϯ͔Βαʔόʔ΁ αʔόʔ ετϨʔδΤϯδϯ όοϑΝϓʔϧ ετϨʔδ ༨༟ͷ݅

  56. ΠϯσοΫε͕࢖͑ΔͱͲ͏ͳΔͷ͔ • 5݅ΛΫϥΠΞϯτʹฦ͚ͩ͢ ͷ؆୯ͳ͓࢓ࣄ αʔόʔ ετϨʔδΤϯδϯ όοϑΝϓʔϧ ετϨʔδ ݅͋Γ·ͨ͠ʂʂʂ ΫϥΠΞϯτ

  57. ΠϯσοΫε͕࢖͑ΔͱͲ͏ͳΔͷ͔ αʔόʔ ετϨʔδΤϯδϯ όοϑΝϓʔϧ ετϨʔδ ฏ࿨ͩ ҆຾Ͱ͖Δ ΫϥΠΞϯτ ಡΈऔΒΕͳ͔ͬͨ ݅

  58. ΠϯσοΫε͕࢖͑ͳ͍ͱͲ͏ͳΔ͔ • σϞ • explainΛݟΔ • explain select * from

    users where name = 'Ճ౻'\G • explain select * from slow_users where name = 'Ճ౻'\G
  59. ΠϯσοΫε͸ࠨ͔Βӈ • ΠϯσοΫεͷΩʔ͸ࠨ୺͔Β͔͠࢖͑ͳ͍ • LIKEͰ͸%͕લʹ͋Δͱ࢖͑ͳ͍ • ࠨ୺͕ෆఆ͔ͩΒ • ࠨ୺͔Βݟ͍ͯ͘ͳΒɺ్த·ͰͰ΋OK •

    σϞ • select * from users where name like 'ాத%' limit 1\G • select * from users where name like '%ాத' limit 1\G
  60. ΠϯσοΫε͸ࠨ͔Βӈ ాத ݈ଠ த઒ ᣦࢠ ాத ͘͞Β 68407 ాத Ұً

    11322 ాத Ұ࿠ 75891 ాத ಸʑ 58408 த઒ ঊ 604143 த઒ ༔ਅ 547645
  61. ΠϯσοΫε͸ࠨ͔Βӈ ాத ݈ଠ த઒ ᣦࢠ ాத ͘͞Β 68407 ాத Ұً

    11322 ాத Ұ࿠ 75891 ాத ಸʑ 58408 த઒ ঊ 604143 த઒ ༔ਅ 547645 ాத%
  62. ΠϯσοΫε͸ࠨ͔Βӈ ాத ݈ଠ த઒ ᣦࢠ ాத ͘͞Β 68407 ాத Ұً

    11322 ాத Ұ࿠ 75891 ాத ಸʑ 58408 த઒ ঊ 604143 த઒ ༔ਅ 547645 ాத% ాதͰ࢝·͍ͬͯΔ෦෼͚ͩݟΔ
  63. ΠϯσοΫε͸ࠨ͔Βӈ ాத ݈ଠ த઒ ᣦࢠ ాத ͘͞Β 68407 ాத Ұً

    11322 ాத Ұ࿠ 75891 ాத ಸʑ 58408 த઒ ঊ 604143 த઒ ༔ਅ 547645 ాத%
  64. ΠϯσοΫε͸ࠨ͔Βӈ ాத ݈ଠ த઒ ᣦࢠ ాத ͘͞Β 68407 ాத Ұً

    11322 ాத Ұ࿠ 75891 ాத ಸʑ 58408 த઒ ঊ 604143 த઒ ༔ਅ 547645 ాத%
  65. ΠϯσοΫε͸ࠨ͔Βӈ ాத ݈ଠ த઒ ᣦࢠ ాத ͘͞Β 68407 ాத Ұً

    11322 ాத Ұ࿠ 75891 ాத ಸʑ 58408 த઒ ঊ 604143 த઒ ༔ਅ 547645 %ాத
  66. ΠϯσοΫε͸ࠨ͔Βӈ ాத ݈ଠ த઒ ᣦࢠ ాத ͘͞Β 68407 ాத Ұً

    11322 ాத Ұ࿠ 75891 ాத ಸʑ 58408 த઒ ঊ 604143 த઒ ༔ਅ 547645 %ాத
  67. ΠϯσοΫε͸ࠨ͔Βӈ ాத ݈ଠ த઒ ᣦࢠ ాத ͘͞Β 68407 ాத Ұً

    11322 ాத Ұ࿠ 75891 ాத ಸʑ 58408 த઒ ঊ 604143 த઒ ༔ਅ 547645 %ాத จࣈྻࠨଆ(ઌ಄ଆ)͔Βιʔτ͞ΕͯΔ͔Β
 ιʔτ͞Ε͍ͯΔ͜ͱΛੜ͔ͤͳ͍
  68. ෳ߹ΠϯσοΫε • ෳ਺ͷΧϥϜΛ·ͱΊͯΠϯσοΫεΛுΔ • ΠϯσοΫεͷҰ෦͚ͩΛ࢖͏͜ͱ΋Ͱ͖Δ • ͜͜Ͱ΋ࠨ͔Βӈ͕ग़ͯ͘Δ • σϞ •

    select count(*) from users where blood_type = 'A' and name like 'ాத%'\G • select count(*) from users where blood_type = 'A'\G
  69. ෳ߹ΠϯσοΫε A, ాத ݈ଠ B, த઒ ᣦࢠ A, ాத ͘͞Β

    68407 A, ాத Ұً 11322 A, த઒ Ұ࿠ 75891 A, த઒ ಸʑ 58408 B, த઒ ঊ 604143 B, த઒ ༔ਅ 547645
  70. ෳ߹ΠϯσοΫε: ෳ߹৚݅ʹΑΔݕࡧ A, ాத ݈ଠ B, த઒ ᣦࢠ A, ాத

    ͘͞Β 68407 A, ాத Ұً 11322 A, த઒ Ұ࿠ 75891 A, த઒ ಸʑ 58408 B, த઒ ঊ 604143 B, த઒ ༔ਅ 547645 A, ాத%
  71. ෳ߹ΠϯσοΫε: ෳ߹৚݅ʹΑΔݕࡧ A, ాத ݈ଠ B, த઒ ᣦࢠ A, ాத

    ͘͞Β 68407 A, ాத Ұً 11322 A, த઒ Ұ࿠ 75891 A, த઒ ಸʑ 58408 B, த઒ ঊ 604143 B, த઒ ༔ਅ 547645 A, ాத%
  72. ෳ߹ΠϯσοΫε: ෳ߹৚݅ʹΑΔݕࡧ A, ాத ݈ଠ B, த઒ ᣦࢠ A, ాத

    ͘͞Β 68407 A, ాத Ұً 11322 A, த઒ Ұ࿠ 75891 A, த઒ ಸʑ 58408 B, த઒ ঊ 604143 B, த઒ ༔ਅ 547645 A, ాத%
  73. ෳ߹ΠϯσοΫε: ෳ߹৚݅ʹΑΔݕࡧ A, ాத ݈ଠ B, த઒ ᣦࢠ A, ాத

    ͘͞Β 68407 A, ాத Ұً 11322 A, த઒ Ұ࿠ 75891 A, த઒ ಸʑ 58408 B, த઒ ঊ 604143 B, த઒ ༔ਅ 547645 A, ాத%
  74. ෳ߹ΠϯσοΫε: Ұ෦ͷ৚݅ʹΑΔݕࡧ(OK) A, ాத ݈ଠ B, த઒ ᣦࢠ A, ాத

    ͘͞Β 68407 A, ాத Ұً 11322 A, த઒ Ұ࿠ 75891 A, த઒ ಸʑ 58408 B, த઒ ঊ 604143 B, த઒ ༔ਅ 547645 A
  75. ෳ߹ΠϯσοΫε: Ұ෦ͷ৚݅ʹΑΔݕࡧ(OK) A, ాத ݈ଠ B, த઒ ᣦࢠ A, ాத

    ͘͞Β 68407 A, ాத Ұً 11322 A, த઒ Ұ࿠ 75891 A, த઒ ಸʑ 58408 B, த઒ ঊ 604143 B, த઒ ༔ਅ 547645 A
  76. ෳ߹ΠϯσοΫε: Ұ෦ͷ৚݅ʹΑΔݕࡧ(OK) A, ాத ݈ଠ B, த઒ ᣦࢠ A, ాத

    ͘͞Β 68407 A, ాத Ұً 11322 A, த઒ Ұ࿠ 75891 A, த઒ ಸʑ 58408 B, த઒ ঊ 604143 B, த઒ ༔ਅ 547645 A
  77. ෳ߹ΠϯσοΫε: Ұ෦ͷ৚݅ʹΑΔݕࡧ(OK) A, ాத ݈ଠ B, த઒ ᣦࢠ A, ాத

    ͘͞Β 68407 A, ాத Ұً 11322 A, த઒ Ұ࿠ 75891 A, த઒ ಸʑ 58408 B, த઒ ঊ 604143 B, த઒ ༔ਅ 547645 A
  78. ෳ߹ΠϯσοΫε: Ұ෦ͷ৚݅ʹΑΔݕࡧ(NG) A, ాத ݈ଠ B, த઒ ᣦࢠ A, ాத

    ͘͞Β 68407 A, ాத Ұً 11322 A, த઒ Ұ࿠ 75891 A, த઒ ಸʑ 58408 B, த઒ ঊ 604143 B, த઒ ༔ਅ 547645 த઒
  79. ෳ߹ΠϯσοΫε: Ұ෦ͷ৚݅ʹΑΔݕࡧ(NG) A, ాத ݈ଠ B, த઒ ᣦࢠ A, ాத

    ͘͞Β 68407 A, ాத Ұً 11322 A, த઒ Ұ࿠ 75891 A, த઒ ಸʑ 58408 B, த઒ ঊ 604143 B, த઒ ༔ਅ 547645 த઒ ݂ӷܕ͕༏ઌ͞Εͯιʔτ͞Ε͍ͯΔ͔Β ໊લ͚ͩͩͱιʔτ͞Ε͍ͯΔ͜ͱΛੜ͔ͤͳ͍
  80. NOTͷѻ͍ • Ұக͍ͤͯ͘͞ͷ͕جຊʹͳΔͨΊΠϯσοΫε͕ޮ ͔ͳ͍ • NOT͸Ͱ͖Δ͚ͩॻ͔ͳ͍Α͏ʹ • σϞ • select

    count(*) from users where name = 'Ճ౻'\G • select count(*) from users where name != 'Ճ౻'\G • select count(*) from users where name like 'Ճ౻%'\G • select count(*) from users where name not like 'Ճ౻%'\G
  81. NULLͷѻ͍ • ࣮͸ΠϯσοΫε͕ޮ͘ • IS NULL • IS NOT NULL

    • ͜ͷڍಈ͸MySQL͚ͩͬΆ͍ • σϞ • select count(*) from users where phone_num is null\G • select count(*) from slow_users where phone_num is null\G • select count(*) from users where phone_num is not null\G • select count(*) from slow_users where phone_num is not null\G
  82. ιʔτ • ݕࡧ͚ͩͰͳ͘ιʔτʹ΋ΠϯσοΫε͕࢖͑Δ • Կ౓΋ग़͖ͯͨΑ͏ʹB+໦ͷϦʔϑ͸ιʔτ͞ΕͯΔ • ෳ߹ΠϯσοΫε͸1൪໨ͰߜΓࠐΜͰ2൪໨Ͱιʔτ Ͱ͖Δ • σϞ

    • select * from users order by order_num limit 1\G • select * from slow_users order by order_num limit 1\G • select * from users where blood_type = 'B' order by birthday limit 1\G • select * from slow_users where blood_type = 'B' order by birthday limit 1\G
  83. ιʔτ A, ాத ݈ଠ B, த઒ ᣦࢠ A, ాத ͘͞Β

    68407 A, ాத Ұً 11322 A, த઒ Ұ࿠ 75891 A, த઒ ಸʑ 58408 B, த઒ ঊ 604143 B, த઒ ༔ਅ 547645 A
  84. ιʔτ A, ాத ݈ଠ B, த઒ ᣦࢠ A, ాத ͘͞Β

    68407 A, ాத Ұً 11322 A, த઒ Ұ࿠ 75891 A, த઒ ಸʑ 58408 B, த઒ ঊ 604143 B, த઒ ༔ਅ 547645 A ઌ಄͕AͰ֬ఆ͍ͯ͠Δͱ͍͏͜ͱ͸
 ΩʔશମͰݟͨΒ໊લͰ΋ιʔτ͞Ε͍ͯΔ
  85. ΧόϦϯάΠϯσοΫε • ʢηΧϯμϦʣΠϯσοΫεʹ͸ΩʔͷΧϥϜͱओΩʔؚ͕·ΕΔ • ΫΤϦதͷSELECTɺWHEREɺORDERͳͲ͕ͦΕΒͷΧϥϜͷΈ Ͱߏ੒͞Ε͍ͯΕ͹σʔλຊମͷB+໦ΛݟΔඞཁͳ͍ͷͰ͸ʁ • Exactlyʢͦͷͱ͓ΓͰ͍͟͝·͢ʣ ͜Εਂ໷ςϯγϣϯͩ •

    σʔλຊମΛݕࡧ͢Δख͕ؒল͔Εͯߴ଎ʹͳΔ • ࢥߟఀࢭͨ͠ঢ়ଶͰORMΛ࢖͏ͱৗʹ SELECT * ʹͳΓɺ͜ͷԸܙ ͕ड͚ΒΕͳ͘ͳΔ • σϞ • select count(*) from users where name = 'Ճ౻ ܙ'\G • select order_num, name from users order by order_num desc limit 1\G
  86. ΧόϦϯάΠϯσοΫε Ճ౻ ݈ଠ த઒ ᣦࢠ Ճ౻ ܙ 13521 Ճ౻ ܙ

    14491 Ճ౻ ݈հ 75891 த઒ ಸʑ 58408 த઒ ঊ 604143 த઒ ༔ਅ 547645 Ճ౻ ܙ
  87. ΧόϦϯάΠϯσοΫε Ճ౻ ݈ଠ த઒ ᣦࢠ Ճ౻ ܙ 13521 Ճ౻ ܙ

    14491 Ճ౻ ݈հ 75891 த઒ ಸʑ 58408 த઒ ঊ 604143 த઒ ༔ਅ 547645 COUNT(*) ʹඞཁͳ৘ใ͸े෼ʹ଍Γ͍ͯΔ name ͔ id ͰΧ΢ϯτ͞ΕΔ Ճ౻ ܙ
  88. ͬ͘͟Γͨ͠໨࣍ • MySQLͷΞʔΩςΫνϟ • ςʔϒϧ΍ΠϯσοΫεͷσʔλߏ଄ • ύϑΥʔϚϯεʹؔ܎͢Δ࿩ • ڍಈʹؔ܎͢Δ࿩

  89. ڍಈʹؔ܎͢Δ࿩ • τϥϯβΫγϣϯ෼཭Ϩϕϧ • σʔλߏ଄ͷ࿩ͱ͸͋·Γؔ࿈ͳ͍

  90. τϥϯβΫγϣϯ෼཭Ϩϕϧ • READ UNCOMMITTED • READ COMMITTED • REPEATABLE READ

    • SERIALIZABLE
  91. READ UNCOMMITTED • ίϛοτ͍ͯ͠ͳ͍σʔλ͕ଞͷτϥϯβΫγϣϯ͔ Βݟ͑Δʢʂʁʣ • ී௨͸࢖Θͳ͍

  92. READ COMMITTED • ଟ͘ͷDBMSʹ͓͚ΔσϑΥϧτ • ଞͷτϥϯβΫγϣϯͰίϛοτ͞Εͨσʔλ͕ݟ͑ Δ

  93. REPEATABLE READ • MySQLͷσϑΥϧτ • ࠓͷτϥϯβΫγϣϯͰ͍ͬͨΜಡΈࠐΜͩσʔλ ͸ɺଞͷτϥϯβΫγϣϯͰมߋ͕ίϛοτ͞Εͨ ޙ΋࠷ॳʹಡΈࠐΜͩͷͱಉ͡಺༰͕ݟ͑Δ

  94. SERIALIZABLE • શͯͷಡΈऔΓͰϩοΫΛͱͬͯଞͷτϥϯβΫγϣ ϯͱͷڝ߹͕ى͖ͳ͍Α͏ʹ͢Δ • ฒྻੑೳ͕ѱ͍ • ϩοΫऔΓ·͘Δ͔ΒσουϩοΫى͖΍͘͢ͳΔ

  95. REPEATABLE READ஫ҙ • ৽ଔ1೥໨ͷ࣌ʹɺ͜ΕΛཧղ͍ͯ͠ͳͯ͘DBͷόά ͩͱࢥͬͯ͠·ͬͨ... • σϞ • A: begin;

    • B: begin; • A: select * from users where id = 123456; • B: select * from users where id = 123456 for update; -- ͜ͷ࣌఺ͰഉଞϩοΫ • B: update users set order_num = order_num + 1 where id = 123456; • B: select * from users where id = 123456; • A: select * from users where id = 123456; -- ·ͩίϛοτͯ͠ͳ͍͔ΒมΘͬͯͳ͍ • B: commit; • A: select * from users where id = 123456; -- ίϛοτޙ͚ͩͲมΘͬͯͳ͍ • A: select * from users where id = 123456 for update; -- B͕ίϛοτͨ͠஋ͰऔΕΔ
  96. ·ͱΊ • Web։ൃ࣌͸DBΛ͔ͬ͠Γҙࣝ͢Δ • MySQL(InnoDB(ͷσϑΥϧτ))ͷΠϯσοΫε͸B+໦ • ͦͷಛੑΛཧղ্ͨ͠ͰΠϯσοΫεΛߟ͑Δ • FOR UPDATEͷ༗ແͰݟ͑Δ஋͕มΘΔͷ͸࢓༷

  97. ͓ܾ·Γͷ • த్ɾ৽ଔ໰Θͣ࠾༻ڧԽதͰ͢ • https://jobs.freee.co.jp • ڵຯ͋Δํ͸αϙʔλʔζ or @mihyaeru21 ·Ͱ