BackEnd

MySQL ์‹คํ–‰ ๊ณ„ํš ํ†บ์•„๋ณด๊ธฐ

mokhs 2024. 4. 28. 20:31

MySQL ์‹คํ–‰ ๊ณ„ํš ๋ถ„์„

๐Ÿ’ก ์‹คํ–‰ ๊ณ„ํš์—์„œ ํ‘œ์‹œ๋˜๋Š” ๊ฐ ์ปฌ๋Ÿผ์ด ์–ด๋–ค ๊ฒƒ์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์•Œ์•„๋ณด์ž

๋ฉ”๋‰ด์–ผํ•œ ์ž‘์—…์ด๋‚˜ ๊ฐ€๋” ์ฟผ๋ฆฌ ์„ฑ๋Šฅ์„ ํ™•์ธํ•˜๊ณ  ์‹ถ์„ ๋•Œ EXPLAIN ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด MySQL ์‹คํ–‰ ๊ณ„ํš์„ ์‚ดํŽด๋ณด๊ฒŒ ๋˜๋Š”๋ฐ,
๊ฐ ์นผ๋Ÿผ์˜ ์˜๋ฏธ์— ๋Œ€ํ•ด์„œ๋Š” ๋ช…ํ™•ํ•˜๊ฒŒ ์ •๋ฆฌํ•˜๊ฑฐ๋‚˜ ์•Œ์•„๋ณธ ๊ฒฝํ—˜์ด ์—†๋Š” ๊ฒƒ ๊ฐ™์•„์„œ ์ด๋ฒˆ ๊ธฐํšŒ์— ์ด๋ฅผ ์ •๋ฆฌํ•˜๊ณ  ์ƒ๊ธฐํ•ฉ๋‹ˆ๋‹ค.

 

id ์นผ๋Ÿผ

๐Ÿ’ก ID ์ปฌ๋Ÿผ์€ ๋‹จ์ˆœํžˆ SELECT ์ฟผ๋ฆฌ ์ˆ˜๋ฅผ ์˜๋ฏธํ•˜๊ณ  ํ•ด๋‹น SELECT ์ฟผ๋ฆฌ๋ฅผ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•œ ์šฉ๋„๋กœ ์‚ฌ์šฉ๋จ.
  • SELECT ์ฟผ๋ฆฌ ์ˆ˜๋ฅผ ์˜๋ฏธํ•˜๋ฏ€๋กœ ๊ฐ™์€ ID๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ ๋ณด์ผ ์ˆ˜๋„ ์žˆ์Œ
  • *์ฟผ๋ฆฌ ์ˆœ์„œ๋Š” ์•„๋‹˜
    • EXPLAIN FORMAT=TREE SELECT ๋ช…๋ น์œผ๋กœ ์ฟผ๋ฆฌ ์ˆœ์„œ ํ™•์ธ ๊ฐ€๋Šฅ

 

select_type ์นผ๋Ÿผ

๐Ÿ’ก SELECT ์ฟผ๋ฆฌ๊ฐ€ ์–ด๋–ค ํƒ€์ž…์ธ์ง€ ํ‘œ์‹œ๋˜๋Š” ์นผ๋Ÿผ

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐ’๋“ค์ด ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ์Œ

SIMPLE

  • UNINON์ด๋‚˜ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋‹จ์ˆœํ•œ SELECT ์ฟผ๋ฆฌ์ธ ๊ฒฝ์šฐ
  • ์ผ๋ฐ˜์ ์œผ๋กœ ์ œ์ผ ๋ฐ”๊นฅ SELECT ์ฟผ๋ฆฌ์˜ select_type์ด SIMPLE

PRIMARY

  • UNION์ด๋‚˜ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ๊ฐ€์ง€๋Š” SELECT ์ฟผ๋ฆฌ์˜ ๊ฐ€์žฅ ๋ฐ”๊นฅ์ชฝ์— ์žˆ๋Š” ๋‹จ์œ„ ์ฟผ๋ฆฌ๋Š” select_type์ด PRIMARY๋กœ ํ‘œ์‹œ๋จ
  • SIMPLE๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ•˜๋‚˜๋งŒ ์กด์žฌ

UNION

  • UNION์œผ๋กœ ๊ฒฐํ•ฉ๋  ์ฟผ๋ฆฌ์— ํ‘œ์‹œ

DEPENDENT

  • ๋‚ด๋ถ€ ์ฟผ๋ฆฌ๊ฐ€ ์™ธ๋ถ€์˜ ๊ฐ’์„ ์ฐธ์กฐํ•ด์„œ ์ฒ˜๋ฆฌ๋  ๋•Œ ํ‘œ๊ธฐ
  • e.g. DEPENDENT UNION, DEPENDENT SUBQUERY
  • ์•„๋ž˜ ์˜ˆ์‹œ๋Š” UNION์ด ์„œ๋ธŒ์ฟผ๋ฆฌ์— ์˜ํ–ฅ์„ ์ฃผ๋ฏ€๋กœ DEPENDENT๊ฐ€ ํ‘œ์‹œ๋œ ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ

UNION RESULT

  • UNION ๊ฒฐ๊ณผ๋ฅผ ๋‹ด์•„๋‘˜ ์ž„์‹œ ํ…Œ์ด๋ธ”
  • ์‹ค์ œ SELECT ์ฟผ๋ฆฌ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„์˜ ID๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š์Œ

SUBQUERY

  • FROM ์ ˆ ์ด์™ธ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ
  • FROM ์ ˆ์— ์‚ฌ์šฉ๋˜๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ๋Š” ํŒŒ์ƒ ํ…Œ์ด๋ธ”(DERIVED)๋กœ ํ‘œ๊ธฐ๋จ
๐Ÿ‘Š ํŒŒ์ƒ ํ…Œ์ด๋ธ”์€ ์ผ๋ฐ˜์ ์œผ๋กœ RDBMS์—์„œ๋Š” ์ธ๋ผ์ธ ๋ทฐ(Inline View) ๋˜๋Š” ์„œ๋ธŒ ์…€๋ ‰ํŠธ(Sub Select)๋ผ๊ณ  ๋ถ€๋ฆ„.

 

DERIVED

  • FROM ์ ˆ์— ์‚ฌ์šฉ๋˜๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ. ์ฆ‰, ํŒŒ์ƒ ํ…Œ์ด๋ธ”์— ํ‘œ๊ธฐ
  • MySQL 5.6 ๋ถ€ํ„ฐ ์ž„์‹œ ํ…Œ์ด๋ธ”์— ์ธ๋ฑ์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋“ฑ ์„ฑ๋Šฅ ์ตœ์ ํ™”๊ฐ€ ๋งŽ์ด ์ง„ํ–‰๋˜์—ˆ์ง€๋งŒ ํ•œ๊ณ„๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•จ.
    • ๊ฒฐ๊ตญ ์ตœ์ ํ™”๋œ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”

UNCACHEABLE

  • ์บ์‹ฑํ•  ์ˆ˜ ์—†์„ ๋•Œ ํ‘œ๊ธฐ๋˜๋Š” prefix
  • ์„œ๋ธŒ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ๋“ฑ์„ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋‚ด๋ถ€์ ์ธ ์บ์‹œ ๊ณต๊ฐ„์— ๋‹ด์•„๋‘๊ฒŒ ๋˜๋Š”๋ฐ, UNCACHEABLE์€ ์ด๊ฒŒ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ๋ฅผ ๋œปํ•จ
  • e.g. UNCACHEABLE SUBQUERY, UNCACHEABLE UNION
  • ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๋Š” ๋ณ€์ˆ˜, RAND ๋“ฑ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋ณ€๋™๋˜๋Š” ๊ฐ’์ธ ๊ฒฝ์šฐ์ž„
  • ์•„๋ž˜๋Š” ์บ์‹œ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์žฌํ™œ์šฉํ•˜๋Š” ๊ตฌ์กฐ ์˜ˆ์‹œ

MATERIALIZED

  • MySQL 5.7๋ฒ„์ „๋ถ€ํ„ฐ ์„œ๋ธŒ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ๋ฅผ ์ž„์‹œ ํ…Œ์ด๋ธ”๋กœ ์ตœ์ ํ™”ํ•˜๋Š”๋ฐ, ์ด ๊ฒฝ์šฐ์— ํ‘œ๊ธฐ๋˜๋Š” ํ‚ค์›Œ๋“œ.

 

table ์นผ๋Ÿผ

๐Ÿ’ก ์‚ฌ์šฉ๋˜๋Š” ํ…Œ์ด๋ธ”๋ช… ํ‘œ๊ธฐ
  • <> ๋กœ ๋‘˜๋Ÿฌ์‹ธ์ธ ์ด๋ฆ„์€ ์ž„์‹œ ํ…Œ์ด๋ธ”
    • <> ์•ˆ์— ํ•ญ์ƒ ํ‘œ์‹œ๋˜๋Š” ์ˆซ์ž๋Š” SELECT ์ฟผ๋ฆฌ์˜ id ๊ฐ’์„ ์ง€์นญ
    • e.g. <derived2> ์ธ ๊ฒฝ์šฐ id 2๋ฅผ ๊ฐ€๋ฆฌํ‚ด

partitions ์นผ๋Ÿผ

๐Ÿ’ก ์ ‘๊ทผํ•  ํŒŒํ‹ฐ์…˜ ๋ชฉ๋ก ํ‘œ๊ธฐ

๋‹ค์Œ ์˜ˆ์‹œ๋Š” joined_date ์นผ๋Ÿผ ๊ธฐ์ค€์œผ๋กœ p_2000, p_2001_2010 ํŒŒํ‹ฐ์…˜์„ ์กฐํšŒํ•˜๋Š” ์‹คํ–‰ ๊ณ„ํš์„ ์กฐํšŒํ•œ ๋ชจ์Šต

๐Ÿ’ก ํŒŒํ‹ฐ์…˜ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ์ฟผ๋ฆฌ์—์„œ type ์นผ๋Ÿผ์ด ALL์ธ ๊ฒฝ์šฐ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋‚˜๋‰œ ํŒŒํ‹ฐ์…˜๋งŒ ํ’€ ์Šค์บ”ํ•˜๊ฒŒ ๋˜๋‹ˆ ์‹คํ–‰ ๊ณ„ํš ํŒ๋‹จ์— ์ฃผ์˜
type ์นผ๋Ÿผ์€ ์•„๋ž˜์—์„œ ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

 

type ์นผ๋Ÿผ

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐ’์ด ํ‘œ๊ธฐ๋  ์ˆ˜ ์žˆ๊ณ  ์œ„์—์„œ๋ถ€ํ„ฐ ์„ฑ๋Šฅ์ด ๋น ๋ฅธ ์ˆœ์ž„

system

  • ๋ ˆ์ฝ”๋“œ๊ฐ€ 1๊ฑด๋งŒ ์กด์žฌํ•˜๋Š” ํ…Œ์ด๋ธ” ๋˜๋Š” ํ•œ ๊ฑด๋„ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํ…Œ์ด๋ธ”์„ ์ฐธ์กฐํ•˜๋Š” ํ˜•ํƒœ์˜ ์ ‘๊ทผ ๋ฐฉ๋ฒ•

const

  • ๋ฐ˜๋“œ์‹œ 1๊ฑด์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ฟผ๋ฆฌ์˜ ์ฒ˜๋ฆฌ ๋ฐฉ์‹
  • ์œ ๋‹ˆํฌ ์ธ๋ฑ์Šค ์Šค์บ”์ด๋ผ๊ณ ๋„ ํ‘œํ˜„ํ•จ
  • e.g. ํ”„๋ผ์ด๋จธ๋ฆฌ ํ‚ค๋‚˜ ์œ ๋‹ˆํฌ ํ‚ค ์นผ๋Ÿผ์„ ์ด์šฉํ•˜๋Š” where ์กฐ๊ฑด์˜ ๊ฒฝ์šฐ
  • ๋‹จ, ๋‹ค์ค‘ ์นผ๋Ÿผ์œผ๋กœ ๊ตฌ์„ฑ๋œ ์œ ๋‹ˆํฌ ํ‚ค์˜ ์ผ๋ถ€ ์นผ๋Ÿผ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋Š” const ํƒ€์ž…์˜ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ

eq_ref

  • ์กฐ์ธ์—์„œ ๋‘ ๋ฒˆ์งธ ์ดํ›„์— ์ฝ๋Š” ํ…Œ์ด๋ธ”์—์„œ ๋ฐ˜๋“œ์‹œ 1๊ฑด๋งŒ ์กด์žฌํ•œ๋‹ค๋Š” ๋ณด์žฅ์ด ์žˆ์–ด์•ผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ ‘๊ทผ ๋ฐฉ๋ฒ•
  • ์•„๋ž˜๋Š” PK๋ฅผ ์กฐ์ธ์— ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ์‹œ

ref

  • ๋™๋“ฑ(Equal) ์กฐ๊ฑด์œผ๋กœ ๊ฒ€์ƒ‰ํ•  ๋•Œ ref ์ ‘๊ทผ ๋ฐฉ๋ฒ•์ด ํ™œ์šฉ๋จ.
  • ๋ฐ˜ํ™˜๋˜๋Š” ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋ฐ˜๋“œ์‹œ 1๊ฑด์ด๋ผ๋Š” ๋ณด์žฅ์ด ์—†์œผ๋ฏ€๋กœ const๋‚˜ eq_ref๋ณด๋‹ค๋Š” ๋น ๋ฅด์ง€ ์•Š์ง€๋งŒ ๋™๋“ฑ ๋น„๊ต์ด๋ฏ€๋กœ ๋งค์šฐ ๋น ๋ฅธ ๋ ˆ์ฝ”๋“œ ์กฐํšŒ ๋ฐฉ๋ฒ•
๐Ÿ’ก ๋™๋“ฑ ๋น„๊ต ์—ฐ์‚ฐ์ž๋Š” `=` ๋˜๋Š” `<=>` ์„ ์˜๋ฏธํ•จ `<=>` ๋Š” NULL์— ๋Œ€ํ•œ ๋น„๊ต ๋ฐฉ์‹๋งŒ ์กฐ๊ธˆ ๋‹ค๋ฅผ ๋ฟ `=` ์™€ ๊ฐ™์€ ์—ฐ์‚ฐ์ž
    • ์ธ๋ฑ์Šค์˜ ๋ถ„ํฌ๋„๊ฐ€ ๋‚˜์˜์ง€ ์•Š๋‹ค๋ฉด ์„ฑ๋Šฅ์ƒ์˜ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•

fulltext

  • MySQL ์„œ๋ฒ„์˜ ์ „๋ฌธ ๊ฒ€์ƒ‰(Full-text Search) ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•ด ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฝ๋Š” ์ ‘๊ทผ ๋ฐฉ๋ฒ•์„ ์˜๋ฏธ
  • ์ „๋ฌธ ๊ฒ€์ƒ‰ ์ธ๋ฑ์Šค๊ฐ€ ํ…Œ์ด๋ธ”์— ์ •์˜๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ + ์ „๋ฌธ ๊ฒ€์ƒ‰ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ(MATCH (...) AGINST (...))
๐Ÿ’ก fulltext๋ณด๋‹ค ์ผ๋ฐ˜ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” range ์ ‘๊ทผ ๋ฐฉ๋ฒ•์ด ๋” ๋นจ๋ฆฌ ์ฒ˜๋ฆฌ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•˜๋‹ค๊ณ  ํ•จ ๋”ฐ๋ผ์„œ ์ „๋ฌธ ๊ฒ€์ƒ‰ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์กฐ๊ฑด๋ณ„๋กœ ์„ฑ๋Šฅ์„ ํ™•์ธํ•ด ๋ณด๋Š” ํŽธ์ด ์ข‹๋‹ค.

ref_or_null

  • ref ์ ‘๊ทผ ๋ฐฉ๋ฒ•์— NULL ๋น„๊ต๊ฐ€ ์ถ”๊ฐ€๋œ ํ˜•ํƒœ

unique_subquery

  • WHERE ์กฐ๊ฑด์ ˆ์—์„œ IN(subquery) ํ˜•ํƒœ์˜ ์ฟผ๋ฆฌ๋ฅผ ์œ„ํ•œ ์ ‘๊ทผ ๋ฐฉ๋ฒ•
  • ์„œ๋ธŒ์ฟผ๋ฆฌ์—์„œ ์ค‘๋ณต๋˜์ง€ ์•Š๋Š” ์œ ๋‹ˆํฌํ•œ ๊ฐ’๋งŒ ๋ฐ˜ํ™˜ํ•  ๋•Œ ์ด ์ ‘๊ทผ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉ

index_subquery

  • IN(subquery) ํ˜•ํƒœ์—์„œ ์„œ๋ธŒ์ฟผ๋ฆฌ๊ฐ€ ์ค‘๋ณต๋œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•ด ์ค‘๋ณต์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ๋˜๋Š” ์ ‘๊ทผ ๋ฐฉ๋ฒ•

range

  • ์ธ๋ฑ์Šค์˜ ์ผ์ • ๋ฒ”์œ„๋ฅผ ์ฝ๋Š” ์ธ๋ฑ์Šค ๋ ˆ์ธ์ง€ ์Šค์บ” ํ˜•ํƒœ์˜ ์ ‘๊ทผ ๋ฐฉ๋ฒ•
๐Ÿ’ก ์ฃผ๋กœ `<`, `>`, `IS NULL`, `BETWEEN`, `IN`, `LIKE` ๋“ฑ์˜ ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•ด ์ธ๋ฑ์Šค๋ฅผ ๊ฒ€์ƒ‰ํ•  ๋•Œ ์‚ฌ์šฉ๋จ
  • ์ผ๋ฐ˜์ ์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ฟผ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ์ ‘๊ทผ ๋ฐฉ๋ฒ•
๐Ÿ’ก ์šฐ๋ฆฌ๊ฐ€ ๋ณดํ†ต “์ธ๋ฑ์Šค๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค”๋ผ๊ณ  ๋งํ•  ๋•Œ๋Š” const, ref, range ์„ธ ๊ฐ€์ง€ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์„ ์ด์•ผ๊ธฐํ•จ
  • ๋ ˆ์ฝ”๋“œ ์ˆ˜์— ๋”ฐ๋ผ ์„ฑ๋Šฅ ์ฐจ์ด๊ฐ€ ์žˆ์ง€๋งŒ range ์ ‘๊ทผ ๋ฐฉ๋ฒ•๋„ ์ƒ๋‹นํžˆ ๋น ๋ฅธ ํŽธ

index_merge

  • 2๊ฐœ ์ด์ƒ์˜ ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•ด ๊ฐ๊ฐ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ณ‘ํ•ฉ(merge)ํ•˜๋Š” ๋ฐฉ์‹
  • index_merge ์ ‘๊ทผ ๋ฐฉ๋ฒ•์ด ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋ณด๋ฉด ์ด๋ฆ„๋งŒํผ ๊ทธ๋ ‡๊ฒŒ ํšจ์œจ์ ์œผ๋กœ ์ž‘๋™ํ•˜์ง„ ์•Š์Œ
    • ์—ฌ๋Ÿฌ ์ธ๋ฑ์Šค๋ฅผ ์ฝ์–ด์•ผ ํ•˜๋ฏ€๋กœ range ์ ‘๊ทผ ๋ฐฉ๋ฒ•๋ณด๋‹ค ํšจ์œจ์„ฑ ๋‚ฎ์Œ
    • ์ „๋ฌธ ๊ฒ€์ƒ‰ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฟผ๋ฆฌ์—์„œ๋Š” index_merge๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š์Œ
    • ํ•ญ์ƒ 2๊ฐœ ์ด์ƒ์˜ ์ง‘ํ•ฉ์ด ๊ฒฐ๊ณผ๋กœ ๋‚˜์˜ค๋ฏ€๋กœ ์ค‘๋ณต ์ œ๊ฑฐ์™€ ๊ฐ™์€ ๋ถ€๊ฐ€์ ์ธ ์ž‘์—…์ด ๋” ํ•„์š”
  • index_merge ์ ‘๊ทผ ๋ฐฉ๋ฒ•์ด ์‚ฌ์šฉ๋  ๋•Œ๋Š” Extra ์นผ๋Ÿผ์— ์ข€ ๋” ๋ถ€๊ฐ€์ ์ธ ์„ค๋ช…์ด ํฌํ•จ๋จ

index

  • ์ธ๋ฑ์Šค๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์ฝ๋Š” ์ธ๋ฑ์Šค ํ’€ ์Šค์บ” ํ˜•ํƒœ์˜ ์ ‘๊ทผ ๋ฐฉ๋ฒ•
๐Ÿ’ก “ํšจ์œจ์ ์œผ๋กœ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค”์‹ถ์€ ์ด๋ฆ„์ด์ง€๋งŒ ์‚ฌ์‹ค ์ธ๋ฑ์Šค ํ’€ ์Šค์บ”์„ ์˜๋ฏธํ•˜๋‹ˆ ์ฃผ์˜

ALL

  • ํ’€ ํ…Œ์ด๋ธ” ์Šค์บ”
  • ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ์„ ํƒํ•˜๋Š” ๊ฐ€์žฅ ๋น„ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•
๐Ÿ’ก InnoDB๋„ ๋‹ค๋ฅธ DBMS์™€ ๊ฐ™์ด ๋Œ€๋Ÿ‰์˜ ๋””์Šคํฌ I/O๊ฐ€ ํ•„์š”ํ•œ ์ž‘์—…์—์„œ ํ•œ๊บผ๋ฒˆ์— ๋งŽ์€ ํŽ˜์ด์ง€๋ฅผ ์ฝ์–ด์˜ค๋Š” ๋ฆฌ๋“œ ์–ดํ—ค๋“œ(Read Ahead) ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•จ.
๋ฆฌ๋“œ ์–ดํ—ค๋“œ(Read Ahead) : ์ธ์ ‘ํ•œ ํŽ˜์ด์ง€๊ฐ€ ์—ฐ์†ํ•ด์„œ ๋ช‡ ๋ฒˆ ์ฝํžˆ๋ฉด ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์ž‘๋™ํ•˜๋Š” ์ฝ๊ธฐ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ตœ๋Œ€ 64๊ฐœ์˜ ํŽ˜์ด์ง€์”ฉ ํ•œ๊บผ๋ฒˆ์— ๋””์Šคํฌ๋กœ๋ถ€ํ„ฐ ์ฝ์–ด ๋“ค์ด๋Š” ์ž‘๋™ ๋ฐฉ์‹

์ผ๋ฐ˜์ ์ธ ์˜จ๋ผ์ธ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ ํ™˜๊ฒฝ์ด ์•„๋‹ˆ๋ผ ๋ฐ์ดํ„ฐ ์›จ์–ดํ•˜์šฐ์Šค๋‚˜ ๋ฐฐ์น˜ ํ”„๋กœ๊ทธ๋žจ์ฒ˜๋Ÿผ ๋Œ€์šฉ๋Ÿ‰์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ž‘์—…์—์„œ๋Š” ์–ต์ง€๋กœ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•˜๋Š” ๋“ฑ์˜ ์ž˜๋ชป ํŠœ๋‹๋œ ์ฟผ๋ฆฌ๋ณด๋‹ค ์ƒํ™ฉ์— ๋”ฐ๋ผ ํ’€ ํ…Œ์ด๋ธ” ์Šค์บ”์ด ๋” ๋‚˜์€ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์ผ ์ˆ˜๋„ ์žˆ์Œ

์ฟผ๋ฆฌ๋ฅผ ํŠœ๋‹ํ•œ๋‹ค๋Š” ๊ฒƒ์ด ๋ฌด์กฐ๊ฑด ์ธ๋ฑ์Šค ํ’€ ์Šค์บ”์ด๋‚˜ ํ…Œ์ด๋ธ” ํ’€ ์Šค์บ”์„ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ผ๋Š” ์ ์„ ๊ธฐ์–ตํ•˜์ž

 

possible_keys ์นผ๋Ÿผ

๐Ÿ’ก ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์ตœ์ ์˜ ์‹คํ–‰ ๊ณ„ํš์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ํ›„๋ณด๋กœ ์„ ์ •ํ–ˆ๋˜ ์ธ๋ฑ์Šค์˜ ๋ชฉ๋ก
  • = ์‚ฌ์šฉ๋ ๋ป”ํ•œ ์ธ๋ฑ์Šค ๋ชฉ๋ก.
  • ์‹ค์ œ ์‚ฌ์šฉ๋œ ์ธ๋ฑ์Šค๊ฐ€ ์•„๋‹ ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ฃผ์˜

 

key ์นผ๋Ÿผ

๐Ÿ’ก ์ตœ์ข… ์„ ํƒ๋œ ์‹คํ–‰ ๊ณ„ํš์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ธ๋ฑ์Šค

 

key_len ์นผ๋Ÿผ

๐Ÿ’ก ์ธ๋ฑ์Šค์—์„œ ๋ช‡ ๋ฐ”์ดํŠธ๊นŒ์ง€ ์‚ฌ์šฉํ–ˆ๋Š”์ง€ ํ‘œ๊ธฐ.
๋‹ค์ค‘ ์นผ๋Ÿผ ์ธ๋ฑ์Šค์˜ ๊ฒฝ์šฐ key_len ์นผ๋Ÿผ ๊ฐ’์„ ํ†ตํ•ด ๋ช‡ ๊ฐœ์˜ ์นผ๋Ÿผ๊นŒ์ง€ ์‚ฌ์šฉํ–ˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Œ!

 

ref ์นผ๋Ÿผ

๐Ÿ’ก ์ฐธ์กฐ ์กฐ๊ฑด(Equal ๋น„๊ต ์กฐ๊ฑด)์œผ๋กœ ์–ด๋–ค ๊ฐ’์ด ์ œ๊ณต๋๋Š”์ง€ ํ‘œ๊ธฐ
  • ์ƒ์ˆ˜๊ฐ’์ธ ๊ฒฝ์šฐ const
  • ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์˜ ์นผ๋Ÿผ๊ฐ’์ธ ๊ฒฝ์šฐ ๊ทธ ํ…Œ์ด๋ธ” ๋ช…๊ณผ ์นผ๋Ÿผ ๋ช…์ด ํ‘œ๊ธฐ๋จ
  • ํƒ€์ž…์„ ๋ณ€ํ™˜ํ•ด์•ผ ํ•˜๋Š” ๋“ฑ MySQL ์„œ๋ฒ„๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ๊ฐ’์„ ๋ณ€ํ™˜ํ•ด์•ผ ํ•  ๋•Œ๋Š” func๊ฐ€ ํ‘œ๊ธฐ ๋จ

์•„๋ž˜ ์‚ฌ์ง„์€ ref ์˜ˆ์‹œ

 

rows ์นผ๋Ÿผ

๐Ÿ’ก ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์‹คํ–‰ ๊ณ„ํš์—์„œ ์˜ˆ์ธกํ–ˆ๋˜ `์ฝ์–ด์•ผํ•  ๋ ˆ์ฝ”๋“œ ๊ฑด์ˆ˜`๋ฅผ ํ‘œ๊ธฐ
  • ๋ ˆ์ฝ”๋“œ ๊ฑด์ˆ˜ ์˜ˆ์ธก์น˜๊ฐ€ ์•„๋‹ˆ๋ผ ํ•ด๋‹น ์ฟผ๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฝ๊ณ  ์ฒดํฌํ•ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ์˜๋ฏธํ•˜๋‹ˆ ์ฃผ์˜
  • ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์‚ฐ์ถœํ•ด ๋‚ธ ์˜ˆ์ƒ ๊ฐ’์œผ๋กœ ์ •ํ™•ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ

 

filtered ์นผ๋Ÿผ

๐Ÿ’ก ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์˜ˆ์ธกํ•œ ๊ฐ’์œผ๋กœ, rows ์นผ๋Ÿผ์— ํ‘œ๊ธฐ๋˜๋Š” ๋ ˆ์ฝ”๋“œ ์ˆ˜์—์„œ ํ•„ํ„ฐ๋ง๋˜์–ด ์‹ค์ œ ์‚ฌ์šฉ๋  ๊ฑธ๋กœ ์˜ˆ์ธก๋˜๋Š” ๋ ˆ์ฝ”๋“œ ๊ฑด์ˆ˜์˜ ๋น„์œจ ํ‘œ๊ธฐ
  • e.g. rows 233์— filtered ๊ฐ’์ด 16.03์ด๋ฉด, 37(=233 * 0.1603) ๊ฑด ์ •๋„ ์‚ฌ์šฉ๋  ๊ฑธ๋กœ ์˜ˆ์ธกํ–ˆ๋‹ค๋Š” ์˜๋ฏธ
  • ์˜ตํ‹ฐ๋งˆ์ด์ €๋Š” ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ๋‚ฎ์ถ”๊ธฐ ์œ„ํ•ด ๋Œ€์ƒ ๊ฑด์ˆ˜๊ฐ€ ์ ์€ ํ…Œ์ด๋ธ”์„ ์„ ํƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Œ
    ๊ทธ๋ž˜์„œ filtered ์นผ๋Ÿผ์— ํ‘œ์‹œ๋˜๋Š” ๊ฐ’์ด ์–ผ๋งˆ๋‚˜ ์ •ํ™•ํžˆ ์˜ˆ์ธก๋  ์ˆ˜ ์žˆ๋Š๋ƒ๋„ ์ค‘์š”.

 

Extra ์นผ๋Ÿผ

๐Ÿ’ก ์ด๋ฆ„๊ณผ ๋‹ฌ๋ฆฌ ์‹คํ–‰ ๊ณ„ํš์—์„œ ์„ฑ๋Šฅ๊ณผ ๊ด€๋ จ๋œ ์ค‘์š”ํ•œ ๋‚ด์šฉ์ด Extra ์นผ๋Ÿผ์— ์ž์ฃผ ํ‘œ๊ธฐ๋˜๊ณ  ์ฃผ๋กœ ๋‚ด๋ถ€์ ์ธ ์ฒ˜๋ฆฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•ด ์กฐ๊ธˆ ๋” ๊นŠ์ด ์žˆ๋Š” ๋‚ด์šฉ์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Œ

๋‹ค์–‘ํ•œ ๋‚ด์šฉ์ด ํ‘œ๊ธฐ๋˜๋ฏ€๋กœ ๋งค๋‰ด์–ผ์„ ์ฐธ๊ณ ํ•˜๊ณ  ๋ช‡ ๊ฐœ๋งŒ ์•Œ์•„๋ณด์ž

Using filesort

  • ORDER BY ์ฒ˜๋ฆฌ๊ฐ€ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•  ๋•Œ ํ‘œ๊ธฐ๋จ
  • ์กฐํšŒ๋œ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ •๋ ฌ์šฉ ๋ฉ”๋ชจ๋ฆฌ ๋ฒ„ํผ์— ๋ณต์‚ฌํ•ด ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๋Š” ์˜๋ฏธ
  • Using filesort๋Š” ๋งŽ์€ ๋ถ€ํ•˜๋ฅผ ์ผ์œผํ‚ค๋ฏ€๋กœ ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์ฟผ๋ฆฌ ํŠœ๋‹ ํ˜น์€ ์ธ๋ฑ์Šค ์ƒ์„ฑ์ด ํ•„์š”

Using index

  • ์ธ๋ฑ์Šค๋งŒ ์ฝ์–ด์„œ ์ฟผ๋ฆฌ๋ฅผ ๋ชจ๋‘ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์„ ๋•Œ ํ‘œ๊ธฐ
    • = ์ปค๋ฒ„๋ง ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

Using index condition

  • ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์ธ๋ฑ์Šค ์ปจ๋””์…˜ ํ‘ธ์‹œ ๋‹ค์šด(Index condition pushdown) ์ตœ์ ํ™”๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ‘œ๊ธฐ
๐Ÿ’ก ์ธ๋ฑ์Šค๋ฅผ ๋น„๊ตํ•˜๋Š” ๊ฑด InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์—์„œ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ ํ…Œ์ด๋ธ”์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋น„๊ตํ•˜๋Š” ๊ฑด MySQL ์—”์ง„์ด ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์œผ๋กœ ์ˆ˜ํ–‰ ์ฃผ์ฒด๊ฐ€ ๋‹ค๋ฆ„.

์ธ๋ฑ์Šค์— ๋Œ€ํ•œ ์ •๋ณด๋Š” MySQL ์—”์ง„์€ ์•Œ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ธ๋ฑ์Šค์— ์กฐํšŒํ•˜๋Š” ์นผ๋Ÿผ์ด ์žˆ์–ด์„œ ์ปค๋ฒ„๋ง ์ธ๋ฑ์Šค๊ฐ€ ๊ฐ€๋Šฅํ•œ ์ƒํ™ฉ์—์„œ๋„ ํ…Œ์ด๋ธ” ๋ ˆ์ฝ”๋“œ๋ฅผ ํ•œ ๋ฒˆ ๋” ์กฐํšŒํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์Œํ•˜์ง€๋งŒ ์ธ๋ฑ์Šค ์กฐ๊ฑด์„ InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์—์„œ MySQL ์—”์ง„์œผ๋กœ pushdown ํ•ด์ฃผ๋ฉด ์ธ๋ฑ์Šค ์ •๋ณด๋ฅผ ์•Œ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ…Œ์ด๋ธ” ๋ ˆ์ฝ”๋“œ๋ฅผ ์กฐํšŒํ•˜์ง€ ์•Š์•„๋„ ๋จ
์ด๋ฅผ ์ธ๋ฑ์Šค ์ปจ๋””์…˜ ํ‘ธ์‹œ ๋‹ค์šด(Index condition pushdown)์ด๋ผ๊ณ  ํ•จ.
์ธ๋ฑ์Šค ์ปจ๋””์…˜ ํ‘ธ์‹œ ๋‹ค์šด์€ MySQL 5.6 ๋ถ€ํ„ฐ ์ง€์›ํ•จ

์•„ํ‚คํ…์ฒ˜ ๊ตฌ์กฐ๋Š” ์•„๋ž˜ ์ด๋ฏธ์ง€ ์ฐธ๊ณ .

 

Using where

  • MySQL ์—”์ง„์—์„œ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์—์„œ ์ „๋‹ฌ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ„๋„์˜ ๊ฐ€๊ณต ์ฒ˜๋ฆฌํ•˜๊ณ  ํ•„ํ„ฐ๋งํ•œ ๊ฒฝ์šฐ
๐Ÿ’ก Using where๊ฐ€ ์„ฑ๋Šฅ์ƒ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ์ง€ ์•„๋‹์ง€๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์„ ๋ณ„ํ•˜๋Š” ๊ฒƒ ์ด ์ค‘์š”ํ•œ๋ฐ, MySQL 8.0๋ถ€ํ„ฐ๋Š” filtered ์นผ๋Ÿผ ๊ฐ’์„ ํ™•์ธ ๊ฐ€๋Šฅํ•˜๊ณ  filterd ๊ฐ’์ด ์ž‘์€ ๊ฒฝ์šฐ(=filter๋˜์–ด ๋‚จ๋Š” ๋ฐ์ดํ„ฐ์˜ ๋น„์œจ์ด ์ ์€ ๊ฒฝ์šฐ)๋ฅผ ํ™•์ธํ•˜๋ฉด ํŒ๋‹จ์ด ๊ฐ€๋Šฅํ•จ

filtered ์นผ๋Ÿผ ๊ฐ’์ด ๊ฝค ์ž‘๋‹ค๊ณ  ํŒ๋‹จ๋˜๋ฉด ์ธ๋ฑ์Šค๋ฅผ ์ถ”๊ฐ€ํ•ด ์ตœ์ ํ™”๋ฅผ ์ง„ํ–‰ํ•ด๋ณผ ์ˆ˜ ์žˆ์Œ

 

 

Reference

- Real MySQL 8.0

๋ฐ˜์‘ํ˜•