ΠϯσοΫε͕͑ͳ͍ͱͲ͏ͳΔ͔
• σϞ
• explainΛݟΔ
• explain select * from users where name = 'Ճ౻'\G
• explain select * from slow_users where name = 'Ճ౻'\G
Slide 59
Slide 59 text
ΠϯσοΫεࠨ͔Βӈ
• ΠϯσοΫεͷΩʔࠨ͔Β͔͑͠ͳ͍
• LIKEͰ%͕લʹ͋Δͱ͑ͳ͍
• ࠨ͕ෆఆ͔ͩΒ
• ࠨ͔Βݟ͍ͯ͘ͳΒɺ్த·ͰͰOK
• σϞ
• select * from users where name like 'ాத%' limit 1\G
• select * from users where name like '%ాத' limit 1\G
ෳ߹ΠϯσοΫε
• ෳͷΧϥϜΛ·ͱΊͯΠϯσοΫεΛுΔ
• ΠϯσοΫεͷҰ෦͚ͩΛ͏͜ͱͰ͖Δ
• ͜͜Ͱࠨ͔Βӈ͕ग़ͯ͘Δ
• σϞ
• select count(*) from users where blood_type = 'A' and name like 'ాத%'\G
• select count(*) from users where blood_type = 'A'\G
Slide 69
Slide 69 text
ෳ߹ΠϯσοΫε
A, ాத ݈ଠ B, த ᣦࢠ
A, ాத ͘͞Β
68407
A, ాத Ұً
11322
A, த Ұ
75891
A, த ಸʑ
58408
B, த ঊ
604143
B, த ༔ਅ
547645
Slide 70
Slide 70 text
ෳ߹ΠϯσοΫε: ෳ߹݅ʹΑΔݕࡧ
A, ాத ݈ଠ B, த ᣦࢠ
A, ాத ͘͞Β
68407
A, ాத Ұً
11322
A, த Ұ
75891
A, த ಸʑ
58408
B, த ঊ
604143
B, த ༔ਅ
547645
A, ాத%
Slide 71
Slide 71 text
ෳ߹ΠϯσοΫε: ෳ߹݅ʹΑΔݕࡧ
A, ాத ݈ଠ B, த ᣦࢠ
A, ాத ͘͞Β
68407
A, ాத Ұً
11322
A, த Ұ
75891
A, த ಸʑ
58408
B, த ঊ
604143
B, த ༔ਅ
547645
A, ాத%
Slide 72
Slide 72 text
ෳ߹ΠϯσοΫε: ෳ߹݅ʹΑΔݕࡧ
A, ాத ݈ଠ B, த ᣦࢠ
A, ాத ͘͞Β
68407
A, ాத Ұً
11322
A, த Ұ
75891
A, த ಸʑ
58408
B, த ঊ
604143
B, த ༔ਅ
547645
A, ాத%
Slide 73
Slide 73 text
ෳ߹ΠϯσοΫε: ෳ߹݅ʹΑΔݕࡧ
A, ాத ݈ଠ B, த ᣦࢠ
A, ాத ͘͞Β
68407
A, ాத Ұً
11322
A, த Ұ
75891
A, த ಸʑ
58408
B, த ঊ
604143
B, த ༔ਅ
547645
A, ాத%
Slide 74
Slide 74 text
ෳ߹ΠϯσοΫε: Ұ෦ͷ݅ʹΑΔݕࡧ(OK)
A, ాத ݈ଠ B, த ᣦࢠ
A, ాத ͘͞Β
68407
A, ాத Ұً
11322
A, த Ұ
75891
A, த ಸʑ
58408
B, த ঊ
604143
B, த ༔ਅ
547645
A
Slide 75
Slide 75 text
ෳ߹ΠϯσοΫε: Ұ෦ͷ݅ʹΑΔݕࡧ(OK)
A, ాத ݈ଠ B, த ᣦࢠ
A, ాத ͘͞Β
68407
A, ాத Ұً
11322
A, த Ұ
75891
A, த ಸʑ
58408
B, த ঊ
604143
B, த ༔ਅ
547645
A
Slide 76
Slide 76 text
ෳ߹ΠϯσοΫε: Ұ෦ͷ݅ʹΑΔݕࡧ(OK)
A, ాத ݈ଠ B, த ᣦࢠ
A, ాத ͘͞Β
68407
A, ాத Ұً
11322
A, த Ұ
75891
A, த ಸʑ
58408
B, த ঊ
604143
B, த ༔ਅ
547645
A
Slide 77
Slide 77 text
ෳ߹ΠϯσοΫε: Ұ෦ͷ݅ʹΑΔݕࡧ(OK)
A, ాத ݈ଠ B, த ᣦࢠ
A, ాத ͘͞Β
68407
A, ాத Ұً
11322
A, த Ұ
75891
A, த ಸʑ
58408
B, த ঊ
604143
B, த ༔ਅ
547645
A
Slide 78
Slide 78 text
ෳ߹ΠϯσοΫε: Ұ෦ͷ݅ʹΑΔݕࡧ(NG)
A, ాத ݈ଠ B, த ᣦࢠ
A, ాத ͘͞Β
68407
A, ాத Ұً
11322
A, த Ұ
75891
A, த ಸʑ
58408
B, த ঊ
604143
B, த ༔ਅ
547645
த
Slide 79
Slide 79 text
ෳ߹ΠϯσοΫε: Ұ෦ͷ݅ʹΑΔݕࡧ(NG)
A, ాத ݈ଠ B, த ᣦࢠ
A, ాத ͘͞Β
68407
A, ాத Ұً
11322
A, த Ұ
75891
A, த ಸʑ
58408
B, த ঊ
604143
B, த ༔ਅ
547645
த
݂ӷܕ͕༏ઌ͞Εͯιʔτ͞Ε͍ͯΔ͔Β
໊લ͚ͩͩͱιʔτ͞Ε͍ͯΔ͜ͱΛੜ͔ͤͳ͍
Slide 80
Slide 80 text
NOTͷѻ͍
• Ұக͍ͤͯ͘͞ͷ͕جຊʹͳΔͨΊΠϯσοΫε͕ޮ
͔ͳ͍
• NOTͰ͖Δ͚ͩॻ͔ͳ͍Α͏ʹ
• σϞ
• select * from users where name not like 'Ճ౻%' limit 1\G
• select * from users where name like 'Ճ౻%' limit 1\G
• select * from users where name != 'Ճ౻' limit 1\G
• ͜ΕMySQL 5.6Ҏ߱ͩͱ͍͚Δ
Slide 81
Slide 81 text
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
Slide 82
Slide 82 text
ιʔτ
• ݕࡧ͚ͩͰͳ͘ιʔτʹΠϯσοΫε͕͑Δ
• Կग़͖ͯͨΑ͏ʹ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
Slide 83
Slide 83 text
ιʔτ
A, ాத ݈ଠ B, த ᣦࢠ
A, ాத ͘͞Β
68407
A, ాத Ұً
11322
A, த Ұ
75891
A, த ಸʑ
58408
B, த ঊ
604143
B, த ༔ਅ
547645
A
Slide 84
Slide 84 text
ιʔτ
A, ాத ݈ଠ B, த ᣦࢠ
A, ాத ͘͞Β
68407
A, ాத Ұً
11322
A, த Ұ
75891
A, த ಸʑ
58408
B, த ঊ
604143
B, த ༔ਅ
547645
A
ઌ಄͕AͰ֬ఆ͍ͯ͠Δͱ͍͏͜ͱ
ΩʔશମͰݟͨΒ໊લͰιʔτ͞Ε͍ͯΔ
Slide 85
Slide 85 text
ΧόϦϯάΠϯσοΫε
• ʢηΧϯμϦʣΠϯσοΫεʹΩʔͷΧϥϜͱओΩʔؚ͕·ΕΔ
• ΫΤϦதͷ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
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͕ίϛοτͨ͠ͰऔΕΔ
Slide 96
Slide 96 text
·ͱΊ
• Web։ൃ࣌DBΛ͔ͬ͠Γҙࣝ͢Δ
• MySQL(InnoDB(ͷσϑΥϧτ))ͷΠϯσοΫεB+
• ͦͷಛੑΛཧղ্ͨ͠ͰΠϯσοΫεΛߟ͑Δ
• FOR UPDATEͷ༗ແͰݟ͑Δ͕มΘΔͷ༷
Slide 97
Slide 97 text
͓ܾ·Γͷ
• த్ɾ৽ଔΘͣ࠾༻ڧԽதͰ͢
• ڵຯ͋Δํαϙʔλʔζ or @mihyaeru21 ·Ͱ