10 min read

Real MySQL 8.0 9์žฅ ์˜ตํ‹ฐ๋งˆ์ด์ €์™€ ํžŒํŠธ

Table of Contents

DBMS์˜ ์˜ตํ‹ฐ๋งˆ์ด์ €๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ตœ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ค ๋ถ„ํฌ๋กœ ์ €์žฅ๋˜์–ด ์žˆ๋Š”์ง€ ๋“ฑ์˜ ์ •๋ณด๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์ตœ์ ์˜ ์‹คํ–‰ ๊ณ„ํš์„ ์ˆ˜๋ฆฝํ•œ๋‹ค.

MySQL์—์„œ๋Š” EXPLAIN ์ด๋ผ๋Š” ๋ช…๋ น์œผ๋กœ ์ฟผ๋ฆฌ์˜ ์‹คํ–‰ ๊ณ„ํš์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

1. ๊ฐœ์š”

์ฟผ๋ฆฌ ์‹คํ–‰ ์ ˆ์ฐจ

MySQL ์„œ๋ฒ„์—์„œ ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ณผ์ •์€ ํฌ๊ฒŒ ์„ธ ๋‹จ๊ณ„๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

  1. ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์š”์ฒญ๋œ SQL ๋ฌธ์žฅ์„ ์ž˜๊ฒŒ ์ชผ๊ฐœ์„œ ๋ถ„๋ฆฌํ•œ๋‹ค (Parse Tree)
    • SQL ๋ฌธ์žฅ์˜ ๋ฌธ๋ฒ• ์˜ค๋ฅ˜๋ฅผ ๊ฒ€์‚ฌ
  2. SQL์˜ Parse Tree๋ฅผ ํ™•์ธํ•˜๋ฉด์„œ ์–ด๋–ค ํ…Œ์ด๋ธ”๋ถ€ํ„ฐ ์ฝ๊ณ  ์–ด๋–ค ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•ด ํ…Œ์ด๋ธ”์„ ์ฝ์„์ง€ ์„ ํƒํ•œ๋‹ค.
    • ๋ถˆํ•„์š”ํ•œ ์กฐ๊ฑด ์ œ๊ฑฐ ๋“ฑ ๋ณต์žกํ•œ ์—ฐ์‚ฐ์˜ ๋‹จ์ˆœํ™”
    • ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์„ ์กฐ์ธํ•˜๋Š” ๊ฒฝ์šฐ ์–ด๋–ค ์ˆœ์„œ๋กœ ํ…Œ์ด๋ธ”์„ ์ฝ์„์ง€ ๊ฒฐ์ •
    • ๊ฐ ํ…Œ์ด๋ธ”์— ์‚ฌ์šฉ๋œ ์กฐ๊ฑด๊ณผ ์ธ๋ฑ์Šค ํ†ต๊ณ„ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์‚ฌ์šฉํ•  ์ธ๋ฑ์Šค ๊ฒฐ์ •
  3. ๋‘ ๋ฒˆ์งธ ๋‹จ๊ณ„์—์„œ ๊ฒฐ์ •๋œ ํ…Œ์ด๋ธ”์˜ ์ฝ๊ธฐ ์ˆœ์„œ๋‚˜ ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•ด ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์œผ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

์˜ตํ‹ฐ๋งˆ์ด์ €์˜ ์ข…๋ฅ˜

ํฌ๊ฒŒ ๊ทœ์น™ ๊ธฐ๋ฐ˜ ์ตœ์ ํ™”์™€ ๋น„์šฉ ๊ธฐ๋ฐ˜ ์ตœ์ ํ™” ๋‘ ๊ฐ€์ง€๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

Rule-based optimizer๋Š” ํ…Œ์ด๋ธ”์˜ ๋ ˆ์ฝ”๋“œ ๊ฑด์ˆ˜๋‚˜ ์„ ํƒ๋„ ๋“ฑ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ  ์˜ตํ‹ฐ๋งˆ์ด์ €์— ๋‚ด์žฅ๋œ ์šฐ์„ ์ˆœ์œ„์— ๋”ฐ๋ผ ์‹คํ–‰ ๊ณ„ํš์„ ์ˆ˜๋ฆฝํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

Cost-based optimizer๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์„ ๋งŒ๋“ค๊ณ  ๊ฐ ๋‹จ์œ„ ์ž‘์—…์˜ ๋น„์šฉ ์ •๋ณด์™€ ๋Œ€์ƒ ํ…Œ์ด๋ธ”์˜ ์˜ˆ์ธก๋œ ํ†ต๊ณ„ ์ •๋ณด๋ฅผ ์ด์šฉํ•ด ์‹คํ–‰ ๊ณ„ํš๋ณ„ ๋น„์šฉ์„ ์‚ฐ์ถœํ•œ๋‹ค.

ํ˜„์žฌ ๋Œ€๋ถ€๋ถ„์˜ DBMS๋“ค์€ Cost-based optimizer๋ฅผ ์‚ฌ์šฉ์ค‘์ด๋‹ค.

๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ

ํ’€ ํ…Œ์ด๋ธ” ์Šค์บ”๊ณผ ํ’€ ์ธ๋ฑ์Šค ์Šค์บ”

ํ’€ ํ…Œ์ด๋ธ” ์Šค์บ”์€ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ํ…Œ์ด๋ธ”์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์ฝ์–ด์„œ ์š”์ฒญ๋œ ๊ฒฐ๊ณผ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค. MySQL ์˜ตํ‹ฐ๋งˆ์ด์ €๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์กฐ๊ฑด์ผ ๋•Œ ์ฃผ๋กœ ํ’€ ํ…Œ์ด๋ธ” ์Šค์บ”์„ ์„ ํƒํ•œ๋‹ค.

  • ํ…Œ์ด๋ธ”์˜ ๋ ˆ์ฝ”๋“œ ๊ฑด์ˆ˜๊ฐ€ ๋„ˆ๋ฌด ์ž‘์•„์„œ ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•ด ์ฝ๋Š” ๊ฒƒ๋ณด๋‹ค ํ…Œ์ด๋ธ”์„ ์ง์ ‘ ์ฝ๋Š” ๊ฒƒ์ด ๋น ๋ฅผ ๋•Œ
  • WHERE ์ ˆ์ด๋‚˜ ON ์ ˆ์— ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ ์ ˆํ•œ ์กฐ๊ฑด์ด ์—†๋Š” ๊ฒฝ์šฐ
  • ์ธ๋ฑ์Šค ๋ ˆ์ธ์ง€ ์Šค์บ”์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด๋„ ์กฐ๊ฑด ์ผ์น˜ ๋ ˆ์ฝ”๋“œ ๊ฑด์ˆ˜๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์€ ๊ฒฝ์šฐ (์ธ๋ฑ์Šค ์ƒ˜ํ”Œ๋ง ์กฐ์‚ฌ ๊ฒฐ๊ณผ)

ํ’€ ํ…Œ์ด๋ธ” ์Šค์บ”์‹œ ํŽ˜์ด์ง€ ํ•˜๋‚˜์”ฉ ์ฝ์ง€ ์•Š๊ณ  ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ๊ฐ€ ํ•œ๋ฒˆ์— ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€๋ฅผ ์ฝ์–ด ๋ฒ„ํผ ํ’€์— ์ €์žฅํ•ด์ค€๋‹ค. ์ด๋ฅผ Read Ahead ๋ผ๊ณ  ํ•œ๋‹ค.

ํ’€ ์ธ๋ฑ์Šค ์Šค์บ”๋„์—์„œ๋„ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•œ๋‹ค.

SELECT COUNT(*) FROM employees;

ํ•ด๋‹น ์ฟผ๋ฆฌ๋Š” ์šฉ๋Ÿ‰์ด ๋” ์ž‘์€ ์ธ๋ฑ์Šค๋ฅผ ํ’€ ์Šค์บ”ํ•œ๋‹ค.

๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ

MySQL 8.0 ์ดํ›„๋ถ€ํ„ฐ innodb_parallel_read_threads ์‹œ์Šคํ…œ ๋ณ€์ˆ˜๋กœ ํ•˜๋‚˜์˜ ์ฟผ๋ฆฌ๋ฅผ ์ตœ๋Œ€ ๋ช‡ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ์ฒ˜๋ฆฌํ• ์ง€ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฌผ๋ก  ์Šค๋ ˆ๋“œ ๊ฐœ์ˆ˜๋ฅผ ๋ฌดํ•œ์ • ๋Š˜๋ ค ๋ดค์ž ์ฝ”์–ด ๊ฐœ์ˆ˜๊ฐ€ ์ •ํ•ด์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์ด ๋ฌดํ•œ์ • ๋Š˜์–ด๋‚˜์ง€๋Š” ์•Š๋Š”๋‹ค.

ORDER BY ์ฒ˜๋ฆฌ

์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•œ ์ •๋ ฌ, Filesort๋ฅผ ์ด์šฉํ•œ ์ •๋ ฌ ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์ด ์กด์žฌํ•œ๋‹ค.

  • ์ธ๋ฑ์Šค
    • ์žฅ์  : ์ธ๋ฑ์Šค๋Š” ์ด๋ฏธ ์ •๋ ฌ๋˜์–ด ์žˆ์–ด์„œ ์กฐํšŒ๊ฐ€ ๋งค์šฐ ๋น ๋ฅด๋‹ค. ์ˆœ์„œ๋Œ€๋กœ ์ฝ๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.
    • ๋‹จ์  : INSERT, UPDATE, DELETE ์ž‘์—… ์‹œ ๋ถ€๊ฐ€์ ์ธ ์ธ๋ฑ์Šค ์ถ”๊ฐ€, ์‚ญ์ œ ์ž‘์—…์ด ํ•„์š”ํ•ด์„œ ๋А๋ฆฌ๋‹ค. ์ธ๋ฑ์Šค ๋•Œ๋ฌธ์— ๋””์Šคํฌ ๊ณต๊ฐ„์ด ๋” ๋งŽ์ด ํ•„์š”ํ•˜๋‹ค.
  • Filesort
    • ์žฅ์  : ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋˜๋ฏ€๋กœ INSERT, UPDATE, DELETE๊ฐ€ ๋” ๋น ๋ฅด๋‹ค.
    • ๋‹จ์  : ์ •๋ ฌ ์ž‘์—…์ด ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์ฒ˜๋ฆฌ๋˜๋ฏ€๋กœ ๋ ˆ์ฝ”๋“œ ๋Œ€์ƒ ๊ฑด์ˆ˜๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ์‘๋‹ต ์†๋„๊ฐ€ ๋А๋ ค์ง„๋‹ค.

MySQL ์„œ๋ฒ„์—์„œ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ณ„๋„์˜ ์ •๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ–ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์‹คํ–‰ ๊ณ„ํš์˜ Extra ์ปฌ๋Ÿผ์— โ€œUsing Filesortโ€ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋œ๋‹ค.

์†ŒํŠธ ๋ฒ„ํผ

์ •๋ ฌ์„ ์œ„ํ•œ ๋ณ„๋„์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ Sort Buffer๋ผ๊ณ  ํ•œ๋‹ค. ์ •๋ ฌ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ํ• ๋‹น๋œ๋‹ค.

์ •๋ ฌํ•ด์•ผ ํ•  ๋ ˆ์ฝ”๋“œ์˜ ๊ฑด์ˆ˜๊ฐ€ ๋งค์šฐ ๋งŽ์•„์„œ ์†ŒํŠธ ๋ฒ„ํผ๋กœ๋งŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ? ์ •๋ ฌํ•ด์•ผ ํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๋ฅผ ์—ฌ๋Ÿฌ ์กฐ๊ฐ์œผ๋กœ ๋‚˜๋ˆ ์„œ ์ •๋ ฌํ•œ๋‹ค. ์ด ๋•Œ ์ž„์‹œ ์ €์žฅ ๊ณต๊ฐ„์œผ๋กœ ๋””์Šคํฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค. ์ดํ›„ ๊ฐ ๋ฒ„ํผ ํฌ๊ธฐ๋งŒํผ ์ •๋ ฌ๋œ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ๋ณ‘ํ•ฉํ•˜๋ฉด์„œ ์ •๋ ฌํ•œ๋‹ค.

์ด๋Ÿฌํ•œ ๊ณผ์ •์€ ๋””์Šคํฌ ์ฝ๊ธฐ, ์“ฐ๊ธฐ๋ฅผ ์œ ๋ฐœํ•œ๋‹ค.

Sort Buffer ํฌ๊ธฐ๋ฅผ ๋„ˆ๋ฌด ํฌ๊ฒŒ ๋งŒ๋“ค๋ฉด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๋Š” ๊ณผ์ •์—์„œ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ณ , OOM์ด ๋ฐœ์ƒํ•˜์—ฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋  ์ˆ˜๋„ ์žˆ๋‹ค.

์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜

๋ ˆ์ฝ”๋“œ๋ฅผ ์ •๋ ฌํ•  ๋•Œ ๋ ˆ์ฝ”๋“œ ์ „์ฒด๋ฅผ ์†ŒํŠธ ๋ฒ„ํผ์— ๋‹ด์•„์„œ ์ •๋ ฌํ• ์ง€, ์ •๋ ฌ ๊ธฐ์ค€์ด ๋˜๋Š” ์ปฌ๋Ÿผ๋งŒ ์†ŒํŠธ ๋ฒ„ํผ์— ๋‹ด์„์ง€์— ๋”ฐ๋ผ ์‹ฑ๊ธ€ ํŒจ์Šค์™€ ํˆฌ ํŒจ์Šค 2๊ฐ€์ง€ ์ •๋ ฌ ๋ชจ๋“œ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

ํˆฌ ํŒจ์Šค ๋ฐฉ์‹์€ ํ…Œ์ด๋ธ”์„ ๋‘ ๋ฒˆ ์ฝ์–ด์•ผ ํ•œ๋‹ค. ์‹ฑ๊ธ€ ํŒจ์Šค ์ •๋ ฌ ๋ฐฉ์‹์€ ๋” ๋งŽ์€ ์†ŒํŠธ ๋ฒ„ํผ ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ตœ์‹  ๋ฒ„์ „์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์‹ฑ๊ธ€ ํŒจ์Šค ์ •๋ ฌ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.

๋งŒ์•ฝ ๋ ˆ์ฝ”๋“œ์˜ ํฌ๊ธฐ๊ฐ€ max_length_for_sort_data ๋ณ€์ˆ˜์— ์„ค์ •๋œ ๊ฐ’๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜, BLOB, TEXT ํƒ€์ž…์˜ ์ปฌ๋Ÿผ์ด ๋Œ€์ƒ์ด ๋˜๋Š” ๊ฒฝ์šฐ ํˆฌ ํŒจ์Šค ์ •๋ ฌ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.

์ •๋ ฌ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•

๋‹ค์Œ ์„ธ ๊ฐ€์ง€ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋กœ ์ •๋ ฌ์ด ์ฒ˜๋ฆฌ๋œ๋‹ค. ์•„๋ž˜๋กœ ๊ฐˆ์ˆ˜๋ก ์ฒ˜๋ฆฌ ์†๋„๊ฐ€ ๋–จ์–ด์ง„๋‹ค.

  • ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•œ ์ •๋ ฌ
  • ์กฐ์ธ์—์„œ ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”๋งŒ ์ •๋ ฌ => Using filesort
  • ์กฐ์ธ ๊ฒฐ๊ณผ๋ฅผ ์ž„์‹œ ํ…Œ์ด๋ธ”์— ์ €์žฅ ํ›„ ์ •๋ ฌ => Using temporary; Using filesort

๋จผ์ € ์˜ตํ‹ฐ๋งˆ์ด์ €๋Š” ์ •๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์ธ๋ฑ์Šค๋ฅด ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ฒ€ํ† ํ•œ๋‹ค. ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋ฉด WHERE ์กฐ๊ฑด์— ์ผ์น˜ํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๋ฅผ ์†ŒํŠธ ๋ฒ„ํผ์— ์ €์žฅํ•˜๋ฉด์„œ ์ •๋ ฌํ•œ๋‹ค.

MySQL ์˜ตํ‹ฐ๋งˆ์ด์ €๋Š” ์ •๋ ฌ ๋Œ€์ƒ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด 2๊ฐ€์ง€ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•œ๋‹ค

  • ์กฐ์ธ์˜ ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”๋งŒ ์ •๋ ฌํ•œ ๋‹ค์Œ ์กฐ์ธ ์ˆ˜ํ–‰
  • ์กฐ์ธ์ด ๋๋‚˜๊ณ  ์ผ์น˜ํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ชจ๋‘ ๊ฐ€์ ธ์˜จ ํ›„ ์ •๋ ฌ์„ ์ˆ˜ํ–‰

์กฐ์ธ์ด ์ˆ˜ํ–‰๋˜๋ฉด์„œ ๋ ˆ์ฝ”๋“œ ํฌ๊ธฐ๊ฐ€ ๋Š˜์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ์ „์ž๊ฐ€ ๋” ํšจ์œจ์ ์ด๋‹ค.

์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•œ ์ •๋ ฌ

๋ฐ˜๋“œ์‹œ ORDER BY์— ๋ช…์‹œ๋œ ์นผ๋Ÿผ์ด ์ œ์ผ ๋จผ์ € ์ฝ๋Š” ํ…Œ์ด๋ธ”(์กฐ์ธ์ด ์‚ฌ์šฉ๋œ ๊ฒฝ์šฐ ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”) ์— ์†ํ•˜๊ณ  ORDER BY์˜ ์ˆœ์„œ๋Œ€๋กœ ์ƒ์„ฑ๋œ ์ธ๋ฑ์Šค๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค. WHERE ์ ˆ์— ์ œ์ผ ๋จผ์ € ์ฝ๋Š” ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ์— ๋Œ€ํ•œ ์กฐ๊ฑด์ด ์žˆ๋‹ค๋ฉด ๊ทธ ์กฐ๊ฑด๊ณผ ORDER BY๋Š” ๊ฐ™์€ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

๋‹น์—ฐํ•˜์ง€๋งŒ ํ•ด์‹œ ์ธ๋ฑ์Šค๋‚˜ ์ „๋ฌธ ๊ฒ€์ƒ‰ ์ธ๋ฑ์Šค์—์„œ๋Š” ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•œ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๋‹ค.

์กฐ์ธ์˜ ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”๋งŒ ์ •๋ ฌ

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

์กฐ์ธ์ด ์ˆ˜ํ–‰๋˜๋ฉด ๋ ˆ์ฝ”๋“œ ๊ฑด์ˆ˜๋„ ๋Š˜์–ด๋‚˜๊ณ  ๋ ˆ์ฝ”๋“œ ํ•˜๋‚˜ํ•˜๋‚˜์˜ ํฌ๊ธฐ๋„ ๋Š˜์–ด๋‚œ๋‹ค. ๊ทธ๋ž˜์„œ ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”์„ ๋จผ์ € ์ •๋ ฌํ•œ ๋‹ค์Œ ์กฐ์ธ์„ ์‹คํ–‰ํ•˜๋ฉด ํšจ์œจ์ ์ด๋‹ค. ์ด ๋ฐฉ๋ฒ•์œผ๋กœ ์ •๋ ฌ์ด ์ˆ˜ํ–‰๋˜๋ ค๋ฉด ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ๋งŒ์œผ๋กœ ORDER BY ์ ˆ์„ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.

SELECT *
FROM employees e, salaries s
WHERE s.emp_no=e.emp_no
AND e.emp_no BETWEEN 102 AND 110
ORDER BY e.last_name;

WHERE ์ ˆ์˜ ์กฐ๊ฑด์€ employees ํ…Œ์ด๋ธ”์˜ PK๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๋˜ salaries์˜ ์กฐ์ธ ์ปฌ๋Ÿผ์ธ emp_no์— ์ธ๋ฑ์Šค๊ฐ€ ์กด์žฌํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์˜ตํ‹ฐ๋งˆ์ด์ €๋Š” employees ํ…Œ์ด๋ธ”์„ ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”๋กœ ์„ ํƒํ•œ๋‹ค.

์ž„์‹œ ํ…Œ์ด๋ธ”์„ ์ด์šฉํ•œ ์ •๋ ฌ
SELECT *
FROM employees e, salaries s
WHERE s.emp_no = e.emp_no
AND e.emp_no BETWEEN 102 AND 110
ORDER BY s.salary;

์ด ์ฟผ๋ฆฌ๋Š” ์ •๋ ฌ ๊ธฐ์ค€์ด ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”์ด ์•„๋‹Œ ๋“œ๋ฆฌ๋ธ ํ…Œ์ด๋ธ”์— ์กด์žฌํ•œ ์ปฌ๋Ÿผ์ด๋‹ค. ์ด ๊ฒฝ์šฐ ์กฐ์ธ ๊ฒฐ๊ณผ๋ฅผ ์ž„์‹œ ํ…Œ์ด๋ธ”์— ์ €์žฅํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์‹œ ์ •๋ ฌํ•ด์•ผ ํ•œ๋‹ค. ๊ฐ€์žฅ ๋А๋ฆฐ ์ •๋ ฌ ๋ฐฉ๋ฒ•์ด๋‹ค.

์ •๋ ฌ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์˜ ์„ฑ๋Šฅ ๋น„๊ต

์ผ๋ฐ˜์ ์œผ๋กœ LIMIT ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฒ˜๋ฆฌํ•˜๋Š” ์–‘์„ ์ค„์ผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ORDER BY ํ˜น์€ GROUP BY ๊ฐ™์€ ์ž‘์—…์€ WHERE ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ LIMIT๋งŒํผ๋งŒ ๊ฐ€์ ธ์™€์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๊ณ  ๋ชจ๋‘ ๊ฐ€์ ธ์˜จ ํ›„ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜ ๊ทธ๋ฃจํ•‘์„ ํ•œ ํ›„ LIMIT์„ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค.

  • ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฐฉ์‹: ์„œ๋ฒ„ ์ชฝ์—์„œ ๋ ˆ์ฝ”๋“œ๊ฐ€ ๊ฒ€์ƒ‰๋  ๋•Œ๋งˆ๋‹ค ๋ฐ”๋กœ๋ฐ”๋กœ ํด๋ผ์ด์–ธํŠธ๋กœ ๊ฒฐ๊ณผ๋ฅผ ์ „์†กํ•ด์ฃผ๋Š” ๋ฐฉ์‹์ด๋‹ค. LIMIT์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฒ˜๋ฆฌ๋Ÿ‰์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฒ„ํผ๋ง ๋ฐฉ์‹: ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์™€์„œ ์ •๋ ฌํ•œ ํ›„ ์ฐจ๋ก€๋Œ€๋กœ ๋ณด๋‚ด์•ผ ํ•œ๋‹ค. LIMIT์„ ์‚ฌ์šฉํ•ด๋„ ์ฒ˜๋ฆฌ๋Ÿ‰์ด ๊ฐœ์„ ๋˜์ง€ ์•Š๋Š”๋‹ค.

ORDER BY ์ฒ˜๋ฆฌ ๋ฐฉ์‹์—์„œ ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•œ ์ •๋ ฌ ๋ฐฉ์‹๋งŒ ์ŠคํŠธ๋ฆฌ๋ฐ ํ˜•ํƒœ์˜ ์ฒ˜๋ฆฌ์ด๊ณ  ๋‚˜๋จธ์ง€๋Š” ๋ชจ๋‘ ๋ฒ„ํผ๋ง ๋ฐฉ์‹์ด๋‹ค.

GROUP BY ์ฒ˜๋ฆฌ

GROUP BY๋„ ์ฟผ๋ฆฌ๊ฐ€ ์ŠคํŠธ๋ฆฌ๋ฐ ๋  ์ˆ˜ ์—†๊ฒŒ ๋งŒ๋“ ๋‹ค. ๋˜‘๊ฐ™์ด ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ์™€ ์ด์šฉํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

์ธ๋ฑ์Šค ์Šค์บ”

ORDER BY์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”์— ์†ํ•œ ์ปฌ๋Ÿผ๋งŒ ์ด์šฉํ•ด ๊ทธ๋ฃจํ•‘ํ•  ๋•Œ ์ธ๋ฑ์Šค ์Šค์บ”์„ ํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋ฏธ ์ •๋ ฌ๋œ ์ธ๋ฑ์Šค๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ์ฝ์œผ๋ฉด์„œ ๊ทธ๋ฃจํ•‘์„ ํ•œ๋‹ค.

๋ฃจ์Šค ์ธ๋ฑ์Šค ์Šค์บ”

๋ฃจ์Šค ์ธ๋ฑ์Šค ์Šค์บ”์€ ์ธ๋ฑ์Šค์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ๊ฑด๋„ˆ๋›ฐ๋ฉด์„œ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ์ฝ์–ด์„œ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ์‹์ด๋‹ค. ๋ฃจ์Šค ์ธ๋ฑ์Šค ์Šค์บ”์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์‹คํ–‰ ๊ณ„ํš์˜ Extra ์ปฌ๋Ÿผ์— โ€œUsing index for group-byโ€ ๋ผ๋Š” ์ฝ”๋ฉ˜ํŠธ๊ฐ€ ํ‘œ์‹œ๋œ๋‹ค.

EXPLAIN
	SELECT emp_no
	FROM salaries
	WHERE from_date='1985-03-01'
	GROUP BY emp_no;

(emp_no, from_date)๋กœ ์ธ๋ฑ์Šค๊ฐ€ ์ƒ์„ฑ๋˜์–ด ์žˆ๋‹ค๊ณ  ํ•˜์ž. ์ด ๊ฒฝ์šฐ WHERE ์ ˆ์— ์žˆ๋Š” ์กฐ๊ฑด์€ ์ธ๋ฑ์Šค ๋ ˆ์ธ์ง€ ์Šค์บ”์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

ํ•˜์ง€๋งŒ ์ด ์ฟผ๋ฆฌ์˜ ์‹คํ–‰ ๊ณ„ํš์€ ์ธ๋ฑ์Šค ๋ ˆ์ธ์ง€ ์Šค์บ”์„ ์‚ฌ์šฉํ–ˆ์œผ๋ฉฐ, GROUP BY ์ฒ˜๋ฆฌ๊นŒ์ง€ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.

  1. (emp_no, from_date) ์ธ๋ฑ์Šค๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ์Šค์บ”ํ•˜๋ฉด์„œ emp_no์˜ ์ฒซ ๋ฒˆ์งธ ์œ ์ผํ•œ ๊ฐ’(10001)์„ ์ฐพ์•„ ๋‚ธ๋‹ค.
  2. (emp_no, from_date) ์ธ๋ฑ์Šค์—์„œ emp_no=10001์ธ ๊ฒƒ ์ค‘์—์„œ from_date=โ€˜1985-03-01โ€™์ธ ๋ ˆ์ฝ”๋“œ๋งŒ ๊ฐ€์ ธ์˜จ๋‹ค. AND ์กฐ๊ฑด์œผ๋กœ (emp_no, from_date) ์ธ๋ฑ์Šค๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•˜๋‹ค.
  3. (emp_no, from_date) ์ธ๋ฑ์Šค์—์„œ ๊ทธ ๋‹ค์Œ emp_no๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
  4. ๋ฐ˜๋ณตํ•œ๋‹ค

์ž„์‹œ ํ…Œ์ด๋ธ” ์ด์šฉ

์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ ์ž„์‹œ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ ๋‹ค. ์ด ๋•Œ GROUP BY ์ ˆ์˜ ์ปฌ๋Ÿผ๋“ค๋กœ ๊ตฌ์„ฑ๋œ ์œ ๋‹ˆํฌ ์ธ๋ฑ์Šค๋ฅผ ๊ฐ€์ง„ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค์–ด์„œ ์ค‘๋ณต ์ œ๊ฑฐ์™€ ์ง‘ํ•ฉ ํ•จ์ˆ˜ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

EXPLAIN
	SELECT e.last_name, AVG(s.salary)
	FROM employees e, salaries s
	WHERE s.emp_no=e.emp_no
	GROUP BY e.last_name;

์ด ์ฟผ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž„์‹œ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•œ๋‹ค.

CREATE TEMPORARY TABLE ... (
	last_name VARCHAR(16),
	salary INT,
	UNIQUE INDEX ux_lastname (last_name)
);

๊ทธ๋ฆฌ๊ณ  ์กฐ์ธ ๊ฒฐ๊ณผ๋ฅผ ํ•œ ๊ฑด์”ฉ ๊ฐ€์ ธ์™€ ์ž„์‹œ ํ…Œ์ด๋ธ”์—์„œ ์ค‘๋ณต ์ฒดํฌ๋ฅผ ํ•˜๋ฉด์„œ INSERT ํ˜น์€ UPDATE๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ๋ณ„๋„์˜ ์ •๋ ฌ ์ž‘์—… ์—†์ด GROUP BY๊ฐ€ ์ฒ˜๋ฆฌ๋œ๋‹ค.

DISTINCT ์ฒ˜๋ฆฌ

ํŠน์ • ์ปฌ๋Ÿผ์˜ ์œ ๋‹ˆํฌํ•œ ๊ฐ’๋งŒ ์กฐํšŒํ•˜๋ ค๋ฉด DISTINCT๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ํฌ๊ฒŒ MIN(), MAX(), COUNT() ๊ฐ™์€ ์ง‘ํ•ฉ ํ•จ์ˆ˜์™€ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ, ์ง‘ํ•ฉ ํ•จ์ˆ˜๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ 2๊ฐ€์ง€๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

SELECT DISTINCT

๋‹จ์ˆœํžˆ SELECT ๋˜๋Š” ๋ ˆ์ฝ”๋“œ ์ค‘์—์„œ ์œ ๋‹ˆํฌํ•œ ๋ ˆ์ฝ”๋“œ๋งŒ ๊ฐ€์ ธ์˜ค๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ GROUP BY์™€ ๋˜‘๊ฐ™์ด ์ฒ˜๋ฆฌ๋œ๋‹ค.

SELECT DISTINCT emp_no FROM salaries;
SELECT emp_no FROM salaries GROUP BY emp_no;

๋‘ ์ฟผ๋ฆฌ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์ง‘ํ•ฉ ํ•จ์ˆ˜์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋œ DISTINCT

์ง‘ํ•ฉ ํ•จ์ˆ˜๊ฐ€ ์—†๋Š” ์ฟผ๋ฆฌ์—์„œ๋Š” ์กฐํšŒํ•˜๋Š” ๋ชจ๋“  ์นผ๋Ÿผ์˜ ์กฐํ•ฉ์ด ์œ ๋‹ˆํฌํ•œ ๊ฒƒ๋“ค๋งŒ ๊ฐ€์ ธ์˜จ๋‹ค. ํ•˜์ง€๋งŒ ์ง‘ํ•ฉ ํ•จ์ˆ˜ ๋‚ด์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ๋Š” ๊ทธ ์ธ์ž๋กœ ์ „๋‹ฌ๋œ ์นผ๋Ÿฝ๊ฐ’์ด ์œ ๋‹ˆํฌํ•œ ๊ฒƒ๋“ค์„ ๊ฐ€์ ธ์˜จ๋‹ค.

์ง‘ํ•ฉ ํ•จ์ˆ˜์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ํ•ญ์ƒ ์ž„์‹œ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๊ฒŒ ๋œ๋‹ค. ํ•˜์ง€๋งŒ ์‹คํ–‰ ๊ณ„ํš์—๋Š” ๋”ฐ๋กœ ํ‘œ์‹œ๋˜์ง€ ์•Š๋Š”๋‹ค.

EXPLAIN
	SELECT COUNT(DISTINCT s.salary)
	from employees e, salaries s
	WHERE e.emp_no=s.emp_no
	and e.emp_no BETWEEN 101 AND 110;

์ด ์ฟผ๋ฆฌ๋Š” ์กฐ์ธ ๊ฒฐ๊ณผ์—์„œ salary ์นผ๋Ÿผ์˜ ๊ฐ’๋งŒ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ์ž„์‹œ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•œ๋‹ค. ๋งŒ์•ฝ COUNT(DISTINCT )๊ฐ€ ๋” ์ถ”๊ฐ€๋œ๋‹ค๋ฉด ์ž„์‹œ ํ…Œ์ด๋ธ”๋„ ์ถ”๊ฐ€๋œ๋‹ค.

ํ•˜์ง€๋งŒ ์ธ๋ฑ์Šค๋œ ์ปฌ๋Ÿผ์— ๋Œ€ํ•ด COUNT(DISTINCT )๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์ธ๋ฑ์Šค๋ฅผ ํƒ€๋ฉด์„œ ์ž„์‹œ ํ…Œ์ด๋ธ” ์—†์ด ์ตœ์ ํ™”๋œ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‚ด๋ถ€ ์ž„์‹œ ํ…Œ์ด๋ธ” ํ™œ์šฉ

  • MySQL ์—”์ง„์ด ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์œผ๋กœ๋ถ€ํ„ฐ ๋ฐ›์•„์˜จ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ •๋ ฌํ•˜๊ฑฐ๋‚˜ ๊ทธ๋ฃจํ•‘ํ•  ๋•Œ๋Š” **๋‚ด๋ถ€์ ์ธ ์ž„์‹œ ํ…Œ์ด๋ธ”(Internal temporary table)**์„ ์‚ฌ์šฉํ•œ๋‹ค.
  • ๋‚ด๋ถ€์ (internal)์ด๋ผ ํ‘œํ˜„ํ•˜๋Š” ์ด์œ ๋Š” CREATE TEMPORARY TABLE ๋ช…๋ น์–ด๋กœ ๋งŒ๋“  ์ž„์‹œ ํ…Œ์ด๋ธ”๊ณผ๋Š” ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ๋‚ด๋ถ€์ ์ธ ์ž„์‹œ ํ…Œ์ด๋ธ”์€ ๋ฉ”๋ชจ๋ฆฌ์— ์ƒ์„ฑ๋๋‹ค๊ฐ€ ํ…Œ์ด๋ธ”์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์ง€๋ฉด ๋””์Šคํฌ๋กœ ์˜ฎ๊ฒจ์ง„๋‹ค. ๋˜ํ•œ ๋‹ค๋ฅธ ์„ธ์…˜์ด๋‚˜ ์ฟผ๋ฆฌ์—์„œ๋Š” ๋ณผ ์ˆ˜ ์—†๊ณ  ์ฟผ๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์ž๋™์œผ๋กœ ์‚ญ์ œ๋œ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ์ž„์‹œ ํ…Œ์ด๋ธ”๊ณผ ๋””์Šคํฌ ์ž„์‹œ ํ…Œ์ด๋ธ”

MySQL 8.0๋ถ€ํ„ฐ TempTable์ด๋ผ๋Š” ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์ด ๋„์ž…๋˜์—ˆ๋‹ค. temptable_max_ram ๊ธฐ๋ณธ๊ฐ’ 1G๊นŒ์ง€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ณ  ๋” ์ปค์ง€๋ฉด ๋””์Šคํฌ์— ๊ธฐ๋กํ•˜๊ฒŒ ๋œ๋‹ค. ์ด ๋•Œ ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

  • MMAP ํŒŒ์ผ
  • InnoDB ํ…Œ์ด๋ธ”

MMAP๋Š” ๋””์Šคํฌ ํŒŒ์ผ์„ ๋ฉ”๋ชจ๋ฆฌ์— ๋งคํ•‘ํ•˜์—ฌ ๋งˆ์น˜ ๋ฉ”๋ชจ๋ฆฌ์ฒ˜๋Ÿผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ๋Œ€์‹  InnoDB ํ…Œ์ด๋ธ”์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํฌ๋ž˜์‹œ ๋ณต๊ตฌ ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

์ž„์‹œ ํ…Œ์ด๋ธ”์ด ํ•„์š”ํ•œ ์ฟผ๋ฆฌ

  • ORDER BY์™€ GROUP BY์— ๋ช…์‹œ๋œ ์นผ๋Ÿผ์ด ๋‹ค๋ฅธ ์ฟผ๋ฆฌ
  • ORDER BY์™€ GROUP BY์— ๋ช…์‹œ๋œ ์นผ๋Ÿผ์ด ์กฐ์ธ์˜ ์ˆœ์„œ์ƒ ์ฒซ ๋ฒˆ์งธ ํ…Œ์ด๋ธ”์ด ์•„๋‹Œ ์ฟผ๋ฆฌ
  • distinct์™€ ORDER BY๊ฐ€ ๋™์‹œ์— ์ฟผ๋ฆฌ์— ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ๋˜๋Š” DISTINCT ๊ฐ€ ์ธ๋ฑ์Šค๋กœ ์ฒ˜๋ฆฌ๋˜์ง€ ๋ชปํ•˜๋Š” ์ฟผ๋ฆฌ
  • UNION์ด๋‚˜ UNION DISTINCT ๊ฐ€ ์‚ฌ์šฉ๋œ ์ฟผ๋ฆฌ(select_type ์นผ๋Ÿผ์ด UNION RESULT์ธ ๊ฒฝ์šฐ)
  • ์ฟผ๋ฆฌ์˜ ์‹คํ–‰ ๊ณ„ํš์—์„œ select_type์ด DERIVED์ธ ์ฟผ๋ฆฌ

์ด ๋ฐ–์—๋„ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•  ๋•Œ๋Š” ๋‚ด๋ถ€ ์ž„์‹œ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

์ž„์‹œ ํ…Œ์ด๋ธ”์ด ๋””์Šคํฌ์— ์ƒ์„ฑ๋˜๋Š” ๊ฒฝ์šฐ

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

  • UNION ์ด๋‚˜ UNION ALL์—์„œ SELECT๋˜๋Š” ์นผ๋Ÿผ ์ค‘์—์„œ ๊ธธ์ด๊ฐ€ 512๋ฐ”์ดํŠธ ์ด์ƒ์ธ ํฌ๊ธฐ์˜ ์นผ๋Ÿผ์ด ์žˆ๋Š” ๊ฒฝ์šฐ
  • GROUP BY๋‚˜ DISTINCT ์นผ๋Ÿผ์—์„œ 512๋ฐ”์ดํŠธ ์ด์ƒ์ธ ํฌ๊ธฐ์˜ ์นผ๋Ÿผ์ด ์žˆ๋Š” ๊ฒฝ์šฐ
  • ๋ฉ”๋ชจ๋ฆฌ ์ž„์‹œ ํ…Œ์ด๋ธ”์˜ ํฌ๊ธฐ๊ฐ€ temp_table_max_ram ์‹œ์Šคํ…œ ๋ณ€์ˆ˜ ๊ฐ’๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ