ํ†ต๊ณ„ ์ •๋ณด

MySQL ์„œ๋ฒ„์˜ ํ†ต๊ณ„ ์ •๋ณด

  • MySQL 5.6๋ถ€ํ„ฐ๋Š” InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์„ ์‚ฌ์šฉํ•˜๋Š” ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ํ†ต๊ณ„ ์ •๋ณด๋ฅผ ์˜๊ตฌ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๊ฐœ์„ ๋˜์—ˆ๋‹ค.
    • ์ด์ „์—๋Š” ๋ฉ”๋ชจ๋ฆฌ์—๋งŒ ์ €์žฅ๋˜์–ด MySQL ์„œ๋ฒ„๊ฐ€ ์žฌ์‹œ์ž‘๋˜๋ฉด ํ†ต๊ณ„ ์ •๋ณด๊ฐ€ ์ดˆ๊ธฐํ™”๋๋‹ค.

ํžˆ์Šคํ† ๊ทธ๋žจ

ํžˆ์Šคํ† ๊ทธ๋žจ์˜ ์ •๋ณด ์ˆ˜์ง‘ ๋ฐ ์‚ญ์ œ

  • Singleton Histogram
    • ์ปฌ๋Ÿผ๊ฐ’ ๊ฐœ๋ณ„๋กœ ๋ ˆ์ฝ”๋“œ ๊ฑด์ˆ˜๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ํžˆ์Šคํ† ๊ทธ๋žจ
  • Equi-Height Histogram
    • ์ปฌ๋Ÿผ๊ฐ’์˜ ๋ฒ”์œ„๋ฅผ ๊ท ๋“ฑํ•œ ๊ฐœ์ˆ˜๋กœ ๊ตฌ๋ถ„ํ•ด์„œ ๊ด€๋ฆฌํ•˜๋Š” ํžˆ์Šคํ† ๊ทธ๋žจ

ํžˆ์Šคํ† ๊ทธ๋žจ์˜ ์šฉ๋„

  • ํžˆ์Šคํ† ๊ทธ๋žจ ์ •๋ณด๊ฐ€ ์—†์œผ๋ฉด ์˜ตํ‹ฐ๋งˆ์ด์ €๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๊ท ๋“ฑํ•˜๊ฒŒ ๋ถ„ํฌ๋ผ ์žˆ์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ธกํ•œ๋‹ค. ํ•˜์ง€๋งŒ ํžˆ์Šคํ† ๊ทธ๋žจ์ด ์žˆ์œผ๋ฉด ํŠน์ • ๋ฒ”์œ„์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ๊ณ  ์ ์Œ์„ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํžˆ์Šคํ† ๊ทธ๋žจ๊ณผ ์ธ๋ฑ์Šค

  • ์ธ๋ฑ์Šค ๋‹ค์ด๋ธŒ (Index Dive)
    • ์˜ตํ‹ฐ๋งˆ์ด์ €๋Š” ์‹คํ–‰ ๊ณ„ํš ์ˆ˜๋ฆฝ ์‹œ ์‹ค์ œ ์ธ๋ฑ์Šค B-Tree๋ฅผ ์ƒ˜ํ”Œ๋งํ•˜์—ฌ ์กฐ๊ฑด์ ˆ์— ์ผ์น˜ํ•˜๋Š” ๋ ˆ์ฝ”๋“œ ๊ฑด์ˆ˜๋ฅผ ์˜ˆ์ธกํ•œ๋‹ค.
  • ์ธ๋ฑ์Šค์™€ ํžˆ์Šคํ† ๊ทธ๋žจ์˜ ๊ด€๊ณ„
    • MySQL 8.0์—์„œ๋Š” ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋Š” ์ปฌ๋Ÿผ์€ ํžˆ์Šคํ† ๊ทธ๋žจ๋ณด๋‹ค ์‹ค์ œ ์ธ๋ฑ์Šค ๋‹ค์ด๋ธŒ๋ฅผ ํ†ตํ•ด ์ˆ˜์ง‘ํ•œ ์ •๋ณด๋ฅผ ์šฐ์„ ํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.
    • ํžˆ์Šคํ† ๊ทธ๋žจ์€ ์ฃผ๋กœ ์ธ๋ฑ์Šค๊ฐ€ ์—†๋Š” ์ปฌ๋Ÿผ์˜ ๋ฐ์ดํ„ฐ ๋ถ„ํฌ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

์ฝ”์ŠคํŠธ ๋ชจ๋ธ(Cost Model)

  • ์ฝ”์ŠคํŠธ ๋ชจ๋ธ์˜ ์—ญํ• 
    • ์ „์ฒด ์ฟผ๋ฆฌ ๋น„์šฉ์„ ๊ณ„์‚ฐํ•˜๋Š” ๋‹จ์œ„ ์ž‘์—…๋“ค์˜ ๋น„์šฉ์„ ๊ด€๋ฆฌํ•œ๋‹ค.
    • MySQL 5.7๋ถ€ํ„ฐ mysql์˜ server_cost์™€ engine_cost ํ…Œ์ด๋ธ”์„ ํ†ตํ•ด ๊ด€๋ฆฌ์ž๊ฐ€ ๋น„์šฉ ์ƒ์ˆ˜๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.
  • ์ฃผ์š” ๋น„์šฉ ์ƒ์ˆ˜
    • io_block_read_cost
      • ๋””์Šคํฌ ๋ฐ์ดํ„ฐ ํŽ˜์ด์ง€ ์ฝ๊ธฐ ๋น„์šฉ.
    • row_evaluate_cost
      • ๋ ˆ์ฝ”๋“œ ๋น„๊ต ๋น„์šฉ.
      • ์ด ๊ฐ’์ด ์ฆ๊ฐ€ํ•˜๋ฉด ํ’€ ์Šค์บ” ๋น„์šฉ์ด ๋†’์•„์ ธ ์ธ๋ฑ์Šค ๋ ˆ์ธ์ง€ ์Šค์บ” ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•„์ง„๋‹ค,.

์‹คํ–‰ ๊ณ„ํš ํ™•์ธ

์‹คํ–‰ ๊ณ„ํš ์ถœ๋ ฅ ํฌ๋งท

  • FORMAT ์˜ต์…˜์„ ํ†ตํ•ด ์‹คํ–‰ ๊ณ„ํš์˜ ํ‘œ์‹œ ๋ฐฉ๋ฒ•์„ JSON์ด๋‚˜ TREE, ๋‹จ์ˆœ ํ…Œ์ด๋ธ” ํ˜•ํƒœ๋กœ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค.
    • EXPLAIN FORMAT=TREE

์ฟผ๋ฆฌ์˜ ์‹คํ–‰ ์‹œ๊ฐ„ ํ™•์ธ

  • EXPLAIN ANALYZE
    • ์‹ค์ œ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋‹จ๊ณ„๋ณ„ ์†Œ์š” ์‹œ๊ฐ„, ์ฒ˜๋ฆฌํ•œ ๋ ˆ์ฝ”๋“œ ๊ฑด์ˆ˜, ๋ฐ˜๋ณต ํšŸ์ˆ˜(loops)๋ฅผ TREE ํฌ๋งท์œผ๋กœ ๋ณด์—ฌ์ค€๋‹ค,.

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

id ์นผ๋Ÿผ

๋‹จ์œ„(SELECT) ์ฟผ๋ฆฌ ์‹๋ณ„์ž

  • SELECT ํ‚ค์›Œ๋“œ ๋‹จ์œ„๋กœ ๋ถ€์—ฌ๋˜๋Š” ์‹๋ณ„์ž ๊ฐ’์ด๋‹ค.
  • ์กฐ์ธ ์‹œ์—๋Š” id๊ฐ€ ์ฆ๊ฐ€ํ•˜์ง€ ์•Š๊ณ  ๊ฐ™์ง€๋งŒ, ์„œ๋ธŒ์ฟผ๋ฆฌ๋‚˜ UNION ์‚ฌ์šฉ ์‹œ id๊ฐ€ ์ฆ๊ฐ€ํ•œ๋‹ค,.

select_type ์นผ๋Ÿผ

๊ฐ ๋‹จ์œ„ SELECT ์ฟผ๋ฆฌ๊ฐ€ ์–ด๋–ค ํƒ€์ž…์˜ ์ฟผ๋ฆฌ์ธ์ง€ ํ‘œ์‹œ๋˜๋Š” ์ปฌ๋Ÿผ

  • SIMPLE
    • UNION์ด๋‚˜ ์„œ๋ธŒ์ฟผ๋ฆฌ๊ฐ€ ์—†๋Š” ๋‹จ์ˆœ SELECT
  • PRIMARY
    • UNION์ด๋‚˜ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ๊ฐ€์ง„ ์ฟผ๋ฆฌ์˜ ๊ฐ€์žฅ ๋ฐ”๊นฅ์ชฝ(Outer) ๋‹จ์œ„ ์ฟผ๋ฆฌ
  • UNION
    • UNION์œผ๋กœ ๊ฒฐํ•ฉํ•˜๋Š” ๋‹จ์œ„ SELECT ์ฟผ๋ฆฌ ์ค‘ ์ฒซ ๋ฒˆ์งธ๋ฅผ ์ œ์™ธํ•œ ๋‘ ๋ฒˆ์งธ ์ดํ›„ ๋‹จ์œ„ SELECT ์ฟผ๋ฆฌ
  • DEPENDENT UNION
    • UNION์ด๋‚˜ UNION ALL๋กœ ์ง‘ํ•ฉ์„ ๊ฒฐํ•ฉํ•˜๋Š” ์ฟผ๋ฆฌ
    • DEPENDENT๋Š” UNION์ด๋‚˜ UNION ALL๋กœ ๊ฒฐํ•ฉ๋œ ๋‹จ์œ„ ์ฟผ๋ฆฌ๊ฐ€ ์™ธ๋ถ€ ์ฟผ๋ฆฌ์— ์˜ํ•ด ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๊ฒƒ์„ ์˜๋ฏธ
  • UNION RESULT
    • UNION ๊ฒฐ๊ณผ๋ฅผ ๋‹ด์•„๋‘๋Š” ํ…Œ์ด๋ธ”์„ ์˜๋ฏธ
  • SUBQUERY
    • FROM ์ ˆ ์ด์™ธ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ๋งŒ์„ ์˜๋ฏธ
  • DEPENDENT SUBQUERY
    • ์„œ๋ธŒ์ฟผ๋ฆฌ๊ฐ€ Outer SELECT ์ฟผ๋ฆฌ์—์„œ ์ •์˜๋œ ์ปฌ๋Ÿผ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ํ‘œ์‹œ
  • DERIVED
    • ๋‹จ์œ„ SELECT ์ฟผ๋ฆฌ์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋‚˜ ๋””์Šคํฌ์— ์ž„์‹œ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธ
  • DEPENDENT DERIVED
    • ํ•ด๋‹น ํ…Œ์ด๋ธ”์ด LATERAL JOIN์ด ์‚ฌ์šฉ๋œ ๊ฒƒ์„ ์˜๋ฏธ
  • UNCACHEABLE SUBQUERY
    • ์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์บ์‹œ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•  ๋•Œ ํ‘œ์‹œ
  • MATERIALIZED
    • FROM ์ ˆ์ด๋‚˜ IN(Subquery) ํ˜•ํƒœ์˜ ์ฟผ๋ฆฌ์— ์šฉ๋œ ์„œ๋ธŒ์ฟผ๋ฆฌ์˜ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ

table ์ปฌ๋Ÿผ

์‹คํ–‰ ๋Œ€์ƒ ํ…Œ์ด๋ธ”

  • ์‹คํ–‰ ๊ณ„ํš์€ ํ…Œ์ด๋ธ” ๊ธฐ์ค€์œผ๋กœ ํ‘œ์‹œ๋œ๋‹ค.
  • <derived N>์€ id N๋ฒˆ ์ฟผ๋ฆฌ์˜ ํŒŒ์ƒ ํ…Œ์ด๋ธ”์„ ์˜๋ฏธํ•œ๋‹ค.

partitions ์ปฌ๋Ÿผ

  • ํŒŒํ‹ฐ์…˜ ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ์‹คํ–‰ ๊ณ„ํš ์ •๋ณด ์ œ๊ณต Partition Pruning
  • ํŒŒํ‹ฐ์…˜ ํ…Œ์ด๋ธ”์—์„œ ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ์— ํ•„์š”ํ•œ ํŒŒํ‹ฐ์…˜๋งŒ ๊ณจ๋ผ๋‚ด๋Š” ๊ณผ์ •์ด๋ฉฐ, ์ ‘๊ทผํ•œ ํŒŒํ‹ฐ์…˜ ๋ชฉ๋ก์ด ์ด ์นผ๋Ÿผ์— ํ‘œ์‹œ๋œ๋‹ค.

type ์ปฌ๋Ÿผ (์ ‘๊ทผ ๋ฐฉ๋ฒ•)

์„ฑ๋Šฅ์ด ๋น ๋ฅธ ์ˆœ์„œ

  • system
    • ๋ ˆ์ฝ”๋“œ๊ฐ€ 0~1๊ฑด์ธ ํ…Œ์ด๋ธ”์„ ์ฐธ์กฐํ•˜๋Š” ํ˜•ํƒœ์˜ ์ ‘๊ทผ ๋ฐฉ๋ฒ•
    • MyISAM, Memory ํ…Œ์ด๋ธ”์—์„œ๋งŒ ์‚ฌ์šฉ
  • const
    • PK๋‚˜ ์œ ๋‹ˆํฌ ํ‚ค๋กœ 1๊ฑด๋งŒ ์กฐํšŒ (๋งค์šฐ ๋น ๋ฆ„).
  • eq_ref
    • ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ” ์กฐ์ธ ์‹œ ํ…Œ์ด๋ธ”์˜ PK๋‚˜ ์œ ๋‹ˆํฌ ํ‚ค๋กœ ๊ฒ€์ƒ‰ ์กฐ๊ฑด์— ์‚ฌ์šฉํ•  ๋•Œ ์‚ฌ์šฉ๋จ
  • ref
    • ์ธ๋ฑ์Šค ์ข…๋ฅ˜์™€ ๊ด€๊ณ„์—†์ด ๋™๋“ฑ(Equal) ์กฐ๊ฑด ๊ฒ€์ƒ‰
    • eq_ref์™€ ๋‹ฌ๋ฆฌ ์กฐ์ธ์˜ ์ˆœ์„œ์™€ ๊ด€๊ฒก๋ฒ—๊ณ , PK๋‚˜ ์œ ๋‹ˆํฌ ํ‚ค ๋“ฑ์˜ ์ œ์•ฝ์กฐ๊ฑด๋„ ์—†๋‹ค.
  • fulltext
    • ์ „๋ฌธ ๊ฒ€์ƒ‰(Full-text Search) ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•ด ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฝ๋Š” ์ ‘๊ทผ ๋ฐฉ๋ฒ•
  • ref_or_null
    • ref ๋ฐฉ์‹ ๋˜๋Š” NULL ๋น„๊ต ์ ‘๊ทผ ๋ฐฉ๋ฒ•
  • unique_subquery
    • WHERE ์กฐ๊ฑด์ ˆ์—์„œ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” IN ํ˜•ํƒœ์˜ ์ฟผ๋ฆฌ๋ฅผ ์œ„ํ•œ ์ ‘๊ทผ ๋ฐฉ๋ฒ•
  • index_subquery
    • ์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์˜ ์ค‘๋ณต๋œ ๊ฐ’์„ ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•ด์„œ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์„ ๋•Œ ์‚ฌ์šฉ
  • range
    • ์ธ๋ฑ์Šค ๋ ˆ์ธ์ง€ ์Šค์บ” (<, >, BETWEEN, IN, LIKE ๋“ฑ)
  • index_merge
    • 2๊ฐœ ์ด์ƒ์˜ ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•ด ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ๋ณ‘ํ•ฉํ•ด์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹
  • index
    • ์ธ๋ฑ์Šค ํ’€ ์Šค์บ”
    • ์ปค๋ฒ„๋ง ์ธ๋ฑ์Šค๋‚˜ ์ •๋ ฌ ์ตœ์ ํ™” ์‹œ ์‚ฌ์šฉ๋จ.
  • ALL
    • ํ’€ ํ…Œ์ด๋ธ” ์Šค์บ” (๊ฐ€์žฅ ๋น„ํšจ์œจ์ )

possible_keys ์ปฌ๋Ÿผ

  • ์‚ฌ์šฉ ํ›„๋ณด์˜€๋˜ ์ธ๋ฑ์Šค ๋ชฉ๋ก (๋ฌด์‹œํ•ด๋„ ๋จ).

key ์ปฌ๋Ÿผ

  • ์‹ค์ œ ์‹คํ–‰ ๊ณ„ํš์—์„œ ์„ ํƒ๋œ ์ธ๋ฑ์Šค.

key_len ์ปฌ๋Ÿผ

  • ์ธ๋ฑ์Šค์˜ ๊ฐ ๋ ˆ์ฝ”๋“œ์—์„œ ๋ช‡ ๋ฐ”์ดํŠธ๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”์ง€ ํ‘œ์‹œ
  • ๋‹ค์ค‘ ์นผ๋Ÿผ ์ธ๋ฑ์Šค์—์„œ ๋ช‡ ๋ฒˆ์งธ ์นผ๋Ÿผ๊นŒ์ง€ ์‚ฌ์šฉํ–ˆ๋Š”์ง€ ํŒŒ์•… ๊ฐ€๋Šฅํ•˜๋‹ค.

ref ์ปฌ๋Ÿผ

  • ์ ‘๊ทผ ๋ฐฉ๋ฒ•์ด ref์ผ ๋•Œ ๋น„๊ต ์กฐ๊ฑด์œผ๋กœ ์–ด๋–ค ๊ฐ’(์ƒ์ˆ˜, ์ปฌ๋Ÿผ ๋“ฑ)์ด ์ œ๊ณต๋˜์—ˆ๋Š”์ง€ ๋ณด์—ฌ์ค€๋‹ค.
  • func๋ผ๊ณ  ๋‚˜์˜ค๋ฉด ๊ฐ’์ด ๋ณ€ํ™˜/๊ฐ€๊ณต๋œ ๊ฒƒ์ด๋‹ค,.

rows ์ปฌ๋Ÿผ

  • ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์ฝ๊ณ  ์ฒดํฌํ•ด์•ผ ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ธก๋˜๋Š” ๋ ˆ์ฝ”๋“œ ๊ฑด์ˆ˜.

filtered ์ปฌ๋Ÿผ

  • ํ•„ํ„ฐ๋ง๋˜๊ณ  ๋‚จ์€ ๋ ˆ์ฝ”๋“œ์˜ ๋น„์œจ(%)
  • ์ด ๊ฐ’์ด ์ •ํ™•ํ• ์ˆ˜๋ก ์กฐ์ธ ์„ฑ๋Šฅ ์˜ˆ์ธก์ด ์ •ํ™•ํ•ด์ง„๋‹ค.

Extra ์ปฌ๋Ÿผ

  • const row not found
  • Deleting all rows
  • Distinct
  • FirstMatch
  • Full scan on NULL key
  • impossible HAVING
  • impossible WHERE
  • LosseScan
  • No matching min/max rows
  • no matching row in const table
  • No matching rows after partition pruning
  • No tables used
  • Not exists
  • Plan isnโ€™t ready yet
  • Range checked for each record (index map:N)
  • Recursive
  • Rematerialize
  • Select tables optimized away
  • Start temporary, End temporary
  • Unique row not found
  • Using filesort
  • Using index(์ปค๋ฒ„๋ง ์ธ๋ฑ์Šค)
  • Using index condition
  • Using index for group-by
  • Using index for skip scan
  • Using join buffer(Block Nested Loop), Using join buffer (Batched Key Access), Using join buffer(hash join)
  • Using MRR
  • Using sort_union, Using union, Using intersect
  • Using temporary
  • Using where
  • Zero limit

Extra

์‹คํ–‰ ๊ณ„ํš์—์„œ ์„ฑ๋Šฅ๊ณผ ๊ด€๋ จ๋œ ์ค‘์š”ํ•œ ๋‚ด๋ถ€ ์ฒ˜๋ฆฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‚˜ ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•˜๋Š” ์ปฌ๋Ÿผ์ž…๋‹ˆ๋‹ค.

  • const row not found
    • const ์ ‘๊ทผ ๋ฐฉ๋ฒ•์œผ๋กœ ํ…Œ์ด๋ธ”์„ ์ฝ์—ˆ์œผ๋‚˜, ์‹ค์ œ๋กœ ํ•ด๋‹น ํ…Œ์ด๋ธ”์— ๋ ˆ์ฝ”๋“œ๊ฐ€ 1๊ฑด๋„ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ
  • Deleting all rows
    • MyISAM ์—”์ง„ ๋“ฑ์—์„œ WHERE ์ ˆ ์—†๋Š” DELETE ๋ฌธ ์‹คํ–‰ ์‹œ, ํ•ธ๋“ค๋Ÿฌ ๊ธฐ๋Šฅ์„ ์ด์šฉํ•ด ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ๋ฅผ ํ•œ ๋ฒˆ์— ์‚ญ์ œํ–ˆ์Œ์„ ์˜๋ฏธ
  • Distinct
    • ์กฐ์ธ ์‹œ ํ•„์š”ํ•œ ๋ ˆ์ฝ”๋“œ๋งŒ ์ฝ๊ณ  ์ค‘๋ณต๋œ ๊ฐ’์€ ๋ฌด์‹œํ•˜๋ฉฐ ์กฐํšŒํ•˜๋Š” ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰
  • FirstMatch
    • ์„ธ๋ฏธ ์กฐ์ธ ์ตœ์ ํ™” ์ค‘ FirstMatch ์ „๋žต์„ ์‚ฌ์šฉํ•˜์—ฌ, ๊ธฐ์ค€ ํ…Œ์ด๋ธ”์˜ ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•ด ์ผ์น˜ํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ ๊ฑด๋งŒ ๊ฒ€์ƒ‰ํ•˜๊ณ  ๋ฉˆ์ถค
  • Full scan on NULL key
    • IN ์„œ๋ธŒ์ฟผ๋ฆฌ ์—ฐ์‚ฐ ์ค‘ ์™ผ์ชฝ ํ”ผ์—ฐ์‚ฐ์ž๊ฐ€ NULL์ธ ๊ฒฝ์šฐ, ์ฐจ์„ ์ฑ…์œผ๋กœ ์„œ๋ธŒ์ฟผ๋ฆฌ ํ…Œ์ด๋ธ”์— ๋Œ€ํ•ด ํ’€ ์Šค์บ”์„ ์ˆ˜ํ–‰
  • Impossible HAVING
    • ์ฟผ๋ฆฌ์— ์‚ฌ์šฉ๋œ HAVING ์ ˆ์˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๊ฐ€ ์—†์„ ๋•Œ(๋ถˆ๊ฐ€๋Šฅํ•œ ์กฐ๊ฑด์ผ ๋•Œ) ํ‘œ์‹œ
  • Impossible WHERE
    • WHERE ์กฐ๊ฑด์ ˆ์ด ํ•ญ์ƒ FALSE๊ฐ€ ๋˜์–ด ์ฟผ๋ฆฌ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๊ฐ€ ํ•˜๋‚˜๋„ ์—†์„ ๋•Œ ํ‘œ์‹œ
  • LooseScan
    • ์„ธ๋ฏธ ์กฐ์ธ ์ตœ์ ํ™” ์ค‘ LooseScan ์ „๋žต(์ธ๋ฑ์Šค๋ฅผ ๋“ฌ์„ฑ๋“ฌ์„ฑ ์ฝ๋Š” ๋ฐฉ์‹)์ด ์‚ฌ์šฉ๋จ
  • No matching min/max row
    • MIN()์ด๋‚˜ MAX()์™€ ๊ฐ™์€ ์ง‘ํ•ฉ ํ•จ์ˆ˜๊ฐ€ ์žˆ๋Š” ์ฟผ๋ฆฌ์˜ WHERE ์กฐ๊ฑด์ ˆ์„ ๋งŒ์กฑํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๊ฐ€ ํ•œ ๊ฑด๋„ ์—†์„ ๋•Œ ํ‘œ์‹œ
  • no matching row in const table
    • ์กฐ์ธ์— ์‚ฌ์šฉ๋œ ํ…Œ์ด๋ธ”์—์„œ const ๋ฐฉ๋ฒ•์œผ๋กœ ์ ‘๊ทผํ–ˆ์œผ๋‚˜ ์ผ์น˜ํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๊ฐ€ ์—†์Œ
  • No matching rows after partition pruning ย ย - ํŒŒํ‹ฐ์…˜ ํ…Œ์ด๋ธ”์—์„œ ํŒŒํ‹ฐ์…˜ ํ”„๋ฃจ๋‹์„ ์ˆ˜ํ–‰ํ–ˆ์œผ๋‚˜, ๋Œ€์ƒ ํŒŒํ‹ฐ์…˜์— ์‚ญ์ œ/์ˆ˜์ •ํ•  ๋ ˆ์ฝ”๋“œ๊ฐ€ ์—†์Œ
  • No tables used ย ย ย ย - FROM ์ ˆ์ด ์—†๊ฑฐ๋‚˜ FROM DUAL ํ˜•ํƒœ์˜ ์ฟผ๋ฆฌ๋กœ, ์‹ค์ œ ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ
  • Not exists
    • ์•„์šฐํ„ฐ ์กฐ์ธ์„ ์ด์šฉํ•ด ์•ˆํ‹ฐ-์กฐ์ธ(Anti-JOIN)์„ ์ˆ˜ํ–‰ํ•  ๋•Œ, ์ผ์น˜ํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๊ฐ€ ์กด์žฌํ•˜๋ฉด ๋” ์ด์ƒ ๊ฒ€์ƒ‰ํ•˜์ง€ ์•Š๊ณ  ์ข…๋ฃŒํ•˜๋Š” ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰
  • Plan isnโ€™t ready yet
    • EXPLAIN FOR CONNECTION ๋ช…๋ น ์‹คํ–‰ ์‹œ, ๋Œ€์ƒ ์ปค๋„ฅ์…˜์—์„œ ์•„์ง ์ฟผ๋ฆฌ ์‹คํ–‰ ๊ณ„ํš์„ ์ˆ˜๋ฆฝํ•˜์ง€ ๋ชปํ•œ ์ƒํƒœ
  • Range checked for each record (index map: N)
    • ๋งค ๋ ˆ์ฝ”๋“œ๋งˆ๋‹ค ์ธ๋ฑ์Šค ์‚ฌ์šฉ ์—ฌ๋ถ€(๋ ˆ์ธ์ง€ ์Šค์บ” vs ํ’€ ์Šค์บ”)๋ฅผ ๋‹ค์‹œ ๊ฒ€ํ† ํ•˜์—ฌ ์ฒ˜๋ฆฌ,
  • Recursive
    • WITH ๊ตฌ๋ฌธ์„ ์ด์šฉํ•œ ์žฌ๊ท€ CTE(Common Table Expression)๊ฐ€ ์‚ฌ์šฉ๋จ,
  • Rematerialize
    • ๋ž˜ํ„ฐ๋Ÿด ์กฐ์ธ ์‹œ ์„ ํ–‰ ํ…Œ์ด๋ธ”์˜ ๋ ˆ์ฝ”๋“œ๋ณ„๋กœ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•ด ๊ฒฐ๊ณผ๋ฅผ ์ž„์‹œ ํ…Œ์ด๋ธ”์— ์ƒˆ๋กœ ์ €์žฅ(๊ตฌ์ฒดํ™”)ํ•จ,
  • Select tables optimized away
    • MIN() ๋˜๋Š” MAX()๋งŒ ์กฐํšŒํ•˜๊ฑฐ๋‚˜ GROUP BY ์—†์ด COUNT(*)๋ฅผ ์กฐํšŒํ•˜๋Š”(MyISAM) ์ฟผ๋ฆฌ๊ฐ€ ์ธ๋ฑ์Šค๋‚˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋งŒ์œผ๋กœ ์ตœ์ ํ™”๋˜์–ด ์ฒ˜๋ฆฌ๋จ
  • Start temporary, End temporary
    • ์„ธ๋ฏธ ์กฐ์ธ์˜ Duplicate Weed-out ์ตœ์ ํ™” ์ „๋žต ์‚ฌ์šฉ ์‹œ ์ค‘๋ณต ์ œ๊ฑฐ๋ฅผ ์œ„ํ•ด ๋‚ด๋ถ€ ์ž„์‹œ ํ…Œ์ด๋ธ” ์‚ฌ์šฉ์˜ ์‹œ์ž‘๊ณผ ๋์„ ์˜๋ฏธ
  • unique row not found
    • ๋‘ ํ…Œ์ด๋ธ”์ด ๊ฐ๊ฐ ์œ ๋‹ˆํฌ(PK ํฌํ•จ) ์นผ๋Ÿผ์œผ๋กœ ์•„์šฐํ„ฐ ์กฐ์ธ์„ ์ˆ˜ํ–‰ํ•˜๋‚˜, ์•„์šฐํ„ฐ ํ…Œ์ด๋ธ”์— ์ผ์น˜ํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๊ฐ€ ์—†์Œ
  • Using filesort
    • ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•œ ์ •๋ ฌ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜์—ฌ, ์กฐํšŒ๋œ ๋ ˆ์ฝ”๋“œ๋ฅผ ์†ŒํŠธ ๋ฒ„ํผ์— ๋ณต์‚ฌํ•ด ๋ณ„๋„๋กœ ์ •๋ ฌ ์ž‘์—…์„ ์ˆ˜ํ–‰
  • Using index (์ปค๋ฒ„๋ง ์ธ๋ฑ์Šค)
    • ๋ฐ์ดํ„ฐ ํŒŒ์ผ์„ ์ฝ์ง€ ์•Š๊ณ  ์ธ๋ฑ์Šค๋งŒ ์ฝ์–ด์„œ ์ฟผ๋ฆฌ๋ฅผ ๋ชจ๋‘ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ,
  • Using index condition
    • MySQL ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์ธ๋ฑ์Šค ์ปจ๋””์…˜ ํ‘ธ์‹œ ๋‹ค์šด(ICP) ์ตœ์ ํ™”๋ฅผ ์‚ฌ์šฉ
  • Using index for group-by
    • GROUP BY ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ๋ณ„๋„์˜ ์ •๋ ฌ ์—†์ด ์ธ๋ฑ์Šค๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์ฝ๊ฑฐ๋‚˜ ๋“ฌ์„ฑ๋“ฌ์„ฑ ์ฝ๋Š” ๋ฃจ์Šค ์ธ๋ฑ์Šค ์Šค์บ”์„ ์‚ฌ์šฉ
  • Using index for skip scan
    • ์ธ๋ฑ์Šค ์Šคํ‚ต ์Šค์บ” ์ตœ์ ํ™”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ๋ฑ์Šค์˜ ์„ ํ–‰ ์นผ๋Ÿผ์„ ๊ฑด๋„ˆ๋›ฐ๊ณ  ๊ฒ€์ƒ‰
  • Using join buffer (Block Nested Loop / Batched Key Access / hash join)
    • ๋“œ๋ฆฌ๋ธ ํ…Œ์ด๋ธ”์— ์ ์ ˆํ•œ ์ธ๋ฑ์Šค๊ฐ€ ์—†์–ด ์กฐ์ธ ๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ๋’ค์— ํ‘œ์‹œ๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜(ํ•ด์‹œ ์กฐ์ธ ๋“ฑ)์œผ๋กœ ์ฒ˜๋ฆฌ๋จ,
  • Using MRR
    • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ‚ค ๊ฐ’์„ ํ•œ ๋ฒˆ์— ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์œผ๋กœ ์ „๋‹ฌํ•˜๊ณ  ์ •๋ ฌํ•˜์—ฌ ์ตœ์†Œํ•œ์˜ ๋””์Šคํฌ ์ ‘๊ทผ์œผ๋กœ ์ฝ๋Š” MRR(Multi Range Read) ์ตœ์ ํ™”๋ฅผ ์‚ฌ์šฉ
  • Using sort_union, Using union, Using intersect
    • index_merge ์ ‘๊ทผ ๋ฐฉ๋ฒ• ์‚ฌ์šฉ ์‹œ ๋‘ ๊ฐœ ์ด์ƒ์˜ ์ธ๋ฑ์Šค ๊ฒฐ๊ณผ๋ฅผ ๋ณ‘ํ•ฉ(ํ•ฉ์ง‘ํ•ฉ, ๊ต์ง‘ํ•ฉ ๋“ฑ)ํ•˜๋Š” ์ƒ์„ธ ๋ฐฉ์‹,
  • Using temporary
    • ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ ์ค‘ ์ค‘๊ฐ„ ๊ฒฐ๊ณผ๋ฅผ ๋‹ด์•„ ๋‘๊ธฐ ์œ„ํ•ด ์ž„์‹œ ํ…Œ์ด๋ธ”(๋ฉ”๋ชจ๋ฆฌ ๋˜๋Š” ๋””์Šคํฌ)์„ ์‚ฌ์šฉ
  • Using where
    • ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์—์„œ ์ฝ์–ด์˜จ ๋ ˆ์ฝ”๋“œ๋ฅผ MySQL ์—”์ง„ ๋ ˆ์ด์–ด์—์„œ ๋ณ„๋„๋กœ ํ•„ํ„ฐ๋ง(์ฒดํฌ ์กฐ๊ฑด ์ฒ˜๋ฆฌ)ํ•จ,
  • Zero limit
    • ์ฟผ๋ฆฌ ๋งˆ์ง€๋ง‰์— LIMIT 0์ด ์‚ฌ์šฉ๋˜์–ด, ๋ฐ์ดํ„ฐ ๊ฐ’์€ ์ฝ์ง€ ์•Š๊ณ  ๊ฒฐ๊ณผ๊ฐ’์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋งŒ ๋ฐ˜ํ™˜