Execution Plan

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

์‹คํ–‰ ๊ณ„ํš์ด๋ž€?

MySQL ์‹คํ–‰ ๊ณ„ํš์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ SQL ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์„ ํƒํ•˜๋Š” ๊ฒฝ๋กœ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์‹คํ–‰ ๊ณ„ํš์„ ์ดํ•ดํ•˜๊ณ  ์ตœ์ ํ™”ํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‘๋‹ต ์‹œ๊ฐ„์„ ํฌ๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹คํ–‰ ๊ณ„ํš์„ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•

์‹คํ–‰ ๊ณ„ํš์„ ํ™•์ธํ•˜๋ ค๋ฉด EXPLAIN ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด MySQL์ด ์ฟผ๋ฆฌ๋ฅผ ์–ด๋–ป๊ฒŒ ์‹คํ–‰ํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

EXPLAIN select *
FROM ์‚ฌ์›
where ์‚ฌ์›๋ฒˆํ˜ธ BETWEEN 10001 and 20000;

1,SIMPLE,์‚ฌ์›,,range,PRIMARY,PRIMARY,4,,18728,100,Using where

์‹คํ–‰ ๊ณ„ํš ์ฝ๊ธฐ

์ด์ „ ๋‹จ๋ฝ์—์„œ EXPLAIN ํ‚ค์›Œ๋“œ๋กœ ์‹คํ–‰ ๊ณ„ํš์„ ์กฐํšŒํ•˜๋ฉด id, select_type, table, type, key ๋“ฑ์˜ ์ •๋ณด๊ฐ€ ์ถœ๋ ฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ID

์‹คํ–‰ ์ˆœ์„œ๋ฅผ ํ‘œ์‹œํ•˜๋Š” ์ˆซ์ž๋กœ, ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜๋Š” ์ฐจ๋ก€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์„ id๋กœ ํ‘œ๊ธฐํ•ฉ๋‹ˆ๋‹ค. ์กฐ์ธ์„ ํ•  ๋•Œ๋Š” ๋™์ผํ•œ id๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.


SELECT_TYPE

SQL ๋ฌธ์„ ๊ตฌ์„ฑํ•˜๋Š” SELECT ๋ฌธ์˜ ์œ ํ˜•์„ ์ถœ๋ ฅํ•˜๋Š” ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค. SELECT ๋ฌธ์ด ๋‹จ์ˆœํžˆ FROM ์ ˆ์— ์œ„์น˜ํ•œ ๊ฒƒ์ธ์ง€, ์„œ๋ธŒ์ฟผ๋ฆฌ์ธ์ง€, UNION ์ ˆ๋กœ ๋ฌถ์ธ SELECT ๋ฌธ์ธ์ง€ ๋“ฑ์˜ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

SIMPLE

UNION์ด๋‚˜ ๋‚ด๋ถ€ ์ฟผ๋ฆฌ๊ฐ€ ์—†๋Š” SELECT ๋ฌธ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ง ๊ทธ๋Œ€๋กœ ๋‹จ์ˆœํ•œ SELECT ๊ตฌ๋ฌธ์œผ๋กœ๋งŒ ์ž‘์„ฑ๋œ ๊ฒฝ์šฐ๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.

EXPLAIN SELECT * FROM ์‚ฌ์› WHERE ์‚ฌ์›๋ฒˆํ˜ธ = 100000;

PRIMARY

์„œ๋ธŒ์ฟผ๋ฆฌ๊ฐ€ ํฌํ•จ๋œ SQL ๋ฌธ์ด ์žˆ์„ ๋•Œ ์ฒซ ๋ฒˆ์งธ SELECT ๋ฌธ์— ํ•ด๋‹นํ•˜๋Š” ๊ตฌ๋ฌธ์— ํ‘œ์‹œ๋˜๋Š” ์œ ํ˜•์ž…๋‹ˆ๋‹ค.

SUBQUERY

๋…๋ฆฝ์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. SELECT ์ ˆ์˜ ์Šค์นผ๋ผ ์„œ๋ธŒ์ฟผ๋ฆฌ์™€ WHERE ์ ˆ์˜ ์ค‘์ฒฉ ์„œ๋ธŒ์ฟผ๋ฆฌ์ผ ๊ฒฝ์šฐ์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

DERIVED

FROM ์ ˆ์— ์ž‘์„ฑ๋œ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ผ๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ์ฆ‰, FROM ์ ˆ์˜ ๋ณ„๋„ ์ž„์‹œ ํ…Œ์ด๋ธ”์ธ ์ธ๋ผ์ธ ๋ทฐ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.

UNION

SELECT ๋ฌธ์—์„œ ์ฒซ ๋ฒˆ์งธ SELECT ๊ตฌ๋ฌธ์„ ์ œ์™ธํ•œ ์ดํ›„์˜ SELECT ๊ตฌ๋ฌธ์— ํ•ด๋‹นํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ด๋•Œ UNION ๊ตฌ๋ฌธ์˜ ์ฒซ ๋ฒˆ์งธ SELECT ์ ˆ์€ PRIMARY ์œ ํ˜•์œผ๋กœ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

UNION RESULT

UNION ALL์ด ์•„๋‹Œ UNION ๊ตฌ๋ฌธ์œผ๋กœ SELECT ์ ˆ์„ ๊ฒฐํ•ฉํ–ˆ์„ ๋•Œ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค. UNION์€ ์ถœ๋ ฅ ๊ฒฐ๊ณผ์— ์ค‘๋ณต์ด ์—†๋Š” ์œ ์ผํ•œ ์†์„ฑ์„ ๊ฐ€์ง€๋ฏ€๋กœ ๊ฐ SELECT ์ ˆ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ์ •๋ ฌํ•˜์—ฌ ์ค‘๋ณต ์ฒดํฌํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์นฉ๋‹ˆ๋‹ค.

ํ•œํŽธ UNION ๊ตฌ๋ฌธ์œผ๋กœ ๊ฒฐํ•ฉ๋˜๊ธฐ ์ „์˜ ๊ฐ SELECT ๋ฌธ์ด ์ค‘๋ณต๋˜์ง€ ์•Š๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋ณด์žฅ๋  ๋•Œ๋Š” UNION ๊ตฌ๋ฌธ๋ณด๋‹ค๋Š” UNION ALL ๊ตฌ๋ฌธ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” SQL ํŠœ๋‹์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

DEPENDENT SUBQUERY

UNION ๋˜๋Š” UNION ALL์„ ์‚ฌ์šฉํ•˜๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ๊ฐ€ ๋ฉ”์ธ ํ…Œ์ด๋ธ”์˜ ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๊ฒฝ์šฐ๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, UNION์œผ๋กœ ์—ฐ๊ฒฐ๋œ ๋‹จ์œ„ ์ฟผ๋ฆฌ๋“ค ์ค‘ ์ฒ˜์Œ์œผ๋กœ ์ž‘์„ฑํ•œ ๋‹จ์œ„ ์ฟผ๋ฆฌ์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, UNION์œผ๋กœ ์—ฐ๊ฒฐ๋˜๋Š” ์ฒซ ๋ฒˆ์งธ ๋‹จ์œ„ ์ฟผ๋ฆฌ๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜์ง€ ๋ชปํ•˜๊ณ  ๋ฉ”์ธ ํ…Œ์ด๋ธ”๋กœ๋ถ€ํ„ฐ ๊ฐ’์„ ํ•˜๋‚˜์”ฉ ๊ณต๊ธ‰๋ฐ›๋Š” ๊ตฌ์กฐ (AND ์‚ฌ์›.์‚ฌ์›๋ฒˆํ˜ธ = ๊ด€๋ฆฌ์ž.์‚ฌ์›๋ฒˆํ˜ธ)์ด๋ฏ€๋กœ ์„ฑ๋Šฅ์ ์œผ๋กœ ๋ถˆ๋ฆฌํ•˜์—ฌ SQL ๋ฌธ์ด ํŠœ๋‹ ๋Œ€์ƒ์ด ๋ฉ๋‹ˆ๋‹ค.

DEPENDENT UNION

UNION ๋˜๋Š” UNION ALL์„ ์‚ฌ์šฉํ•˜๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ๊ฐ€ ๋ฉ”์ธ ํ…Œ์ด๋ธ”์˜ ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๊ฒฝ์šฐ๋กœ, UNION์œผ๋กœ ์—ฐ๊ฒฐ๋œ ๋‹จ์œ„ ์ฟผ๋ฆฌ ์ค‘ ์ฒซ ๋ฒˆ์งธ ๋‹จ์œ„ ์ฟผ๋ฆฌ๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋‘ ๋ฒˆ์งธ ๋‹จ์œ„ ์ฟผ๋ฆฌ์— ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค.

์ฆ‰, UNION์œผ๋กœ ์—ฐ๊ฒฐ๋˜๋Š” ๋‘ ๋ฒˆ์งธ ์ดํ›„์˜ ๋‹จ์œ„ ์ฟผ๋ฆฌ๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜์ง€ ๋ชปํ•˜๊ณ  ๋ฉ”์ธ ํ…Œ์ด๋ธ”๋กœ๋ถ€ํ„ฐ ๊ฐ’์„ ํ•˜๋‚˜์”ฉ ๊ณต๊ธ‰๋ฐ›๋Š” ๊ตฌ์กฐ์ด๋ฏ€๋กœ ์„ฑ๋Šฅ์ ์œผ๋กœ ๋ถˆ๋ฆฌํ•˜์—ฌ SQL ๋ฌธ์ด ํŠœ๋‹ ๋Œ€์ƒ์ด ๋ฉ๋‹ˆ๋‹ค.

UNCACHEABLE SUBQUERY

๋ง ๊ทธ๋Œ€๋กœ ๋ฉ”๋ชจ๋ฆฌ์— ์ƒ์ฃผํ•˜์—ฌ ์žฌํ™œ์šฉ๋˜์–ด์•ผ ํ•  ์„œ๋ธŒ์ฟผ๋ฆฌ๊ฐ€ ์žฌ์‚ฌ์šฉ๋˜์ง€ ๋ชปํ•  ๋•Œ ์ถœ๋ ฅ๋˜๋Š” ์œ ํ˜•์ž…๋‹ˆ๋‹ค.

ํ•ด๋‹น ์„œ๋ธŒ์ฟผ๋ฆฌ ์•ˆ์— ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜๋‚˜ ์‚ฌ์šฉ์ž ๋ณ€์ˆ˜๊ฐ€ ํฌํ•จ๋˜๊ฑฐ๋‚˜ RAND(), UUID() ํ•จ์ˆ˜ ๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งค๋ฒˆ ์กฐํšŒ ์‹œ๋งˆ๋‹ค ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง€๋Š” ๊ฒฝ์šฐ์— ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ ์ž์ฃผ ํ˜ธ์ถœ๋˜๋Š” SQL ๋ฌธ์ด๋ผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ์— ์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ€ ์ƒ์ฃผํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ SQL ํŠœ๋‹์„ ๊ฒ€ํ† ํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

MATERIALIZED

IN ์ ˆ ๊ตฌ๋ฌธ์— ์—ฐ๊ฒฐ๋œ ์„œ๋ธŒ์ฟผ๋ฆฌ๊ฐ€ ์ž„์‹œ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•œ ๋’ค, ์กฐ์ธ์ด๋‚˜ ๊ฐ€๊ณต ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์ถœ๋ ฅ๋˜๋Š” ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ์ฆ‰, IN ์ ˆ์˜ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ์ž„์‹œ ํ…Œ์ด๋ธ”๋กœ ๋งŒ๋“ค์–ด์„œ ์กฐ์ธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.


TABLE

table์€ ๋ง ๊ทธ๋Œ€๋กœ ํ…Œ์ด๋ธ”๋ช…์„ ํ‘œ์‹œํ•˜๋Š” ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค. ์‹คํ–‰ ๊ณ„ํš ์ •๋ณด์—์„œ ํ…Œ์ด๋ธ”๋ช…์ด๋‚˜ ํ…Œ์ด๋ธ” ๋ณ„์นญ(alias)์„ ์ถœ๋ ฅํ•˜๋ฉฐ, ์„œ๋ธŒ์ฟผ๋ฆฌ๋‚˜ ์ž„์‹œ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค์–ด์„œ ๋ณ„๋„์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ๋Š” <subquery#>๋‚˜ <derived#>๋ผ๊ณ  ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

partitions

์‹คํ–‰ ๊ณ„ํš์˜ ๋ถ€๊ฐ€ ์ •๋ณด๋กœ, ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋œ ๋…ผ๋ฆฌ์ ์ธ ์˜์—ญ์„ ํ‘œ์‹œํ•˜๋Š” ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค. ์‚ฌ์ „์— ์ •์˜ํ•œ ์ „์ฒด ํŒŒํ‹ฐ์…˜ ์ค‘ ํŠน์ • ํŒŒํ‹ฐ์…˜์— ์„ ํƒ์ ์œผ๋กœ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด SQL ์„ฑ๋Šฅ ์ธก๋ฉด์—์„œ ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋„ˆ๋ฌด ๋งŽ์€ ์˜์—ญ์˜ ํŒŒํ‹ฐ์…˜์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ถœ๋ ฅ๋œ๋‹ค๋ฉด ํŒŒํ‹ฐ์…˜ ์ •์˜๋ฅผ ํŠœ๋‹ํ•ด๋ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

TYPE

ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฐพ์„์ง€์— ๊ด€ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค. ํ…Œ์ด๋ธ”์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์ „๋ถ€ ํ™•์ธํ• ์ง€, ์•„๋‹ˆ๋ฉด ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•ด ๋ฐ”๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์•„๊ฐˆ์ง€ ๋“ฑ์„ ํ•ด์„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SYSTEM

ํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๊ฑฐ๋‚˜ ํ•œ ๊ฐœ๋งŒ ์žˆ๋Š” ๊ฒฝ์šฐ๋กœ, ์„ฑ๋Šฅ์ƒ ์ตœ์ƒ์˜ type์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

CONST

์กฐํšŒ๋˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹จ 1๊ฑด์ผ ๋•Œ ์ถœ๋ ฅ๋˜๋Š” ์œ ํ˜•์œผ๋กœ, ์„ฑ๋Šฅ์ƒ ๋งค์šฐ ์œ ๋ฆฌํ•œ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

๊ณ ์œ  ์ธ๋ฑ์Šค๋‚˜ ๊ธฐ๋ณธํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹จ 1๊ฑด์˜ ๋ฐ์ดํ„ฐ์—๋งŒ ์ ‘๊ทผํ•˜๋ฉด ๋˜๋ฏ€๋กœ, ์†๋„๋‚˜ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ ์ธก๋ฉด์—์„œ ์ง€ํ–ฅํ•ด์•ผ ํ•  ํƒ€์ž…์ž…๋‹ˆ๋‹ค.

EQ_REF

์กฐ์ธ์ด ์ˆ˜ํ–‰๋  ๋•Œ ๋“œ๋ฆฌ๋ธ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๋ฉฐ, ๊ณ ์œ  ์ธ๋ฑ์Šค ๋˜๋Š” ๊ธฐ๋ณธ ํ‚ค๋กœ ๋‹จ 1๊ฑด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”๊ณผ์˜ ์กฐ์ธ ํ‚ค๊ฐ€ ๋“œ๋ฆฌ๋ธ ํ…Œ์ด๋ธ”์— ์œ ์ผํ•˜๋ฏ€๋กœ ์กฐ์ธ์ด ์ˆ˜ํ–‰๋  ๋•Œ ์„ฑ๋Šฅ์ƒ ๊ฐ€์žฅ ์œ ๋ฆฌํ•œ ๊ฒฝ์šฐ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

REF

์กฐ์ธ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ๋“œ๋ฆฌ๋ธ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๋ฒ”์œ„๊ฐ€ 2๊ฐœ ์ด์ƒ์ผ ๊ฒฝ์šฐ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”์˜ ํ•œ ๊ฐœ ๊ฐ’์ด ๋“œ๋ฆฌ๋ธ ํ…Œ์ด๋ธ”์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋กœ ์กด์žฌํ•˜๋Š” ์ผ๋Œ€๋‹ค ๊ด€๊ณ„์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ, = , <, > ๋“ฑ์˜ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด ์ธ๋ฑ์Šค๋กœ ์ƒ์„ฑ๋œ ์—ด์„ ๋น„๊ตํ•  ๋•Œ๋„ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

REF_OR_NULL

IS NULL ๊ตฌ๋ฌธ์— ๋Œ€ํ•ด ์ธ๋ฑ์Šค๋ฅผ ํ™œ์šฉํ•˜๋„๋ก ์ตœ์ ํ™”๋œ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

ํ…Œ์ด๋ธ”์—์„œ ๊ฒ€์ƒ‰ํ•  NULL ๋ฐ์ดํ„ฐ ์–‘์ด ์ ๋‹ค๋ฉด ref_or_null ๋ฐฉ์‹์„ ํ™œ์šฉํ–ˆ์„ ๋•Œ ํšจ์œจ์ ์ธ SQL ๋ฌธ์ด ๋  ๊ฒƒ์ด๋‚˜, ๊ฒ€์ƒ‰ํ•  NULL ๋ฐ์ดํ„ฐ ์–‘์ด ๋งŽ๋‹ค๋ฉด SQL ํŠœ๋‹์˜ ๋Œ€์ƒ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

RANGE

ํ…Œ์ด๋ธ” ๋‚ด์˜ ์—ฐ์†๋œ ๋ฐ์ดํ„ฐ ๋ฒ”์œ„๋ฅผ ์กฐํšŒํ•˜๋Š” ์œ ํ˜•์œผ๋กœ, =, <, <=, >, >=, BETWEEN, IN ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด ๋ฒ”์œ„ ์Šค์บ”์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

์ฃผ์–ด์ง„ ๋ฐ์ดํ„ฐ ๋ฒ”์œ„ ๋‚ด์—์„œ ํ–‰ ๋‹จ์œ„๋กœ ์Šค์บ”ํ•˜์ง€๋งŒ, ์Šค์บ”ํ•  ๋ฒ”์œ„๊ฐ€ ๋„“์œผ๋ฉด ์„ฑ๋Šฅ ์ €ํ•˜์˜ ์š”์ธ์ด ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ SQL ํŠœ๋‹ ๊ฒ€ํ†  ๋Œ€์ƒ์ด ๋ฉ๋‹ˆ๋‹ค.

FULLTEXT

ํ…์ŠคํŠธ ๊ฒ€์ƒ‰์„ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ „๋ฌธ ์ธ๋ฑ์Šค (FULLTEXT index)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

INDEX_MERGE

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

INDEX

์ธ๋ฑ์Šค ํ’€ ์Šค์บ”์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋ฌผ๋ฆฌ์ ์ธ ์ธ๋ฑ์Šค ๋ธ”๋ก์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ํ›‘๋Š” ๋ฐฉ์‹์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

์ด๋•Œ ๋ฐ์ดํ„ฐ๋ฅผ ์Šค์บ”ํ•˜๋Š” ๋Œ€์ƒ์ด ์ธ๋ฑ์Šค๋ผ๋Š” ์ ์ด ๋‹ค๋ฅผ ๋ฟ, ์ดํ›„ ์„ค๋ช…ํ•  ALL ์œ ํ˜•(ํ…Œ์ด๋ธ” ํ’€ ์Šค์บ” ๋ฐฉ์‹)๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค๋Š” ๋ณดํ†ต ํ…Œ์ด๋ธ”๋ณด๋‹ค ํฌ๊ธฐ๊ฐ€ ์ž‘์œผ๋ฏ€๋กœ ํ…Œ์ด๋ธ” ํ’€ ์Šค์บ” ๋ฐฉ์‹๋ณด๋‹ค๋Š” ๋น ๋ฅผ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.

ALL

ํ…Œ์ด๋ธ”์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์ฝ๋Š” ํ…Œ์ด๋ธ” ํ’€ ์Šค์บ” ๋ฐฉ์‹์— ํ•ด๋‹น๋˜๋Š” ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ALL ์œ ํ˜•์€ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ธ๋ฑ์Šค๊ฐ€ ์—†๊ฑฐ๋‚˜, ์ธ๋ฑ์Šค๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ์˜คํžˆ๋ ค ๋น„ํšจ์œจ์ ์ด๋ผ๊ณ  ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ํŒ๋‹จํ–ˆ์„ ๋•Œ ์„ ํƒ๋ฉ๋‹ˆ๋‹ค.

ALL ์œ ํ˜•์ผ ๋•Œ๋Š” ์ธ๋ฑ์Šค๋ฅผ ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๊ธฐ์กด ์ธ๋ฑ์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ ์ธ๋ฑ์Šค๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ SQL ํŠœ๋‹์„ ํ•  ์ˆ˜ ์žˆ์œผ๋‚˜, ์ „์ฒด ํ…Œ์ด๋ธ” ์ค‘ 10~20% ์ด์ƒ ๋ถ„๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ๋•Œ๋Š” ALL ์œ ํ˜•์ด ์˜คํžˆ๋ ค ์„ฑ๋Šฅ์ƒ ์œ ๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


POSSIBLE_KEYS

์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ SQL ๋ฌธ์„ ์ตœ์ ํ™”ํ•˜๊ณ ์ž ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ธ๋ฑ์Šค ๋ชฉ๋ก์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋งŒ ์‹ค์ œ ์‚ฌ์šฉํ•œ ์ธ๋ฑ์Šค๊ฐ€ ์•„๋‹Œ, ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ›„๋ณด๊ตฐ์˜ ๊ธฐ๋ณธ ํ‚ค์™€ ์ธ๋ฑ์Šค ๋ชฉ๋ก๋งŒ ๋ณด์—ฌ์ฃผ๋ฏ€๋กœ SQL ํŠœ๋‹์˜ ํšจ์šฉ์„ฑ์€ ์—†์Šต๋‹ˆ๋‹ค.


KEY

์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ SQL ๋ฌธ์„ ์ตœ์ ํ™”ํ•˜๊ณ ์ž ์‚ฌ์šฉํ•œ ๊ธฐ๋ณธ ํ‚ค(PK) ๋˜๋Š” ์ธ๋ฑ์Šค๋ช…์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ค ์ธ๋ฑ์Šค๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ–ˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋น„ํšจ์œจ์ ์ธ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ–ˆ๊ฑฐ๋‚˜ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด SQL ํŠœ๋‹์˜ ๋Œ€์ƒ์ด ๋ฉ๋‹ˆ๋‹ค.

KEY_LEN

์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ธ๋ฑ์Šค ์ „์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ผ๋ถ€ ์ธ๋ฑ์Šค๋งŒ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, ์‚ฌ์šฉํ•œ ์ธ๋ฑ์Šค์˜ ๋ฐ”์ดํŠธ ์ˆ˜๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.


REF

ref๋Š” ํ…Œ์ด๋ธ” ์กฐ์ธ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์–ด๋–ค ์กฐ๊ฑด์œผ๋กœ ํ•ด๋‹น ํ…Œ์ด๋ธ”์— ์•ก์„ธ์Šค๋˜์—ˆ๋Š”์ง€๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ์ •๋ณด์ž…๋‹ˆ๋‹ค.

ROWS

SQL ๋ฌธ์„ ์ˆ˜ํ–‰ํ•˜๊ณ ์ž ์ ‘๊ทผํ•˜๋Š” ๋ฐ์ดํ„ฐ์˜ ๋ชจ๋“  ํ–‰ ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์˜ˆ์ธก ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค.

์ฆ‰, ๋””์Šคํฌ์—์„œ ๋ฐ์ดํ„ฐ ํŒŒ์ผ์„ ์ฝ๊ณ  ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ํ–‰ ์ˆ˜๋ฅผ ์˜ˆ์ƒํ•˜๋Š” ๊ฐ’์œผ๋กœ, ์ˆ˜์‹œ๋กœ ๋ณ€๋™๋˜๋Š” MySQL์˜ ํ†ต๊ณ„ ์ •๋ณด๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์‚ฐ์ถœํ•˜๋Š” ๊ฐ’์ด๋ฏ€๋กœ ์ˆ˜์น˜๊ฐ€ ์ •ํ™•ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.


FILTERED

SQL ๋ฌธ์„ ์ˆ˜ํ–‰ํ•˜๊ณ ์ž ์ ‘๊ทผํ•˜๋Š” ๋ฐ์ดํ„ฐ์˜ ๋ชจ๋“  ํ–‰ ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์˜ˆ์ธก ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค.

์ฆ‰, ๋””์Šคํฌ์—์„œ ๋ฐ์ดํ„ฐ ํŒŒ์ผ์„ ์ฝ๊ณ  ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ํ–‰ ์ˆ˜๋ฅผ ์˜ˆ์ƒํ•˜๋Š” ๊ฐ’์ด๋ฉฐ, ์ˆ˜์‹œ๋กœ ๋ณ€๋™๋˜๋Š” MySQL์˜ ํ†ต๊ณ„ ์ •๋ณด๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์‚ฐ์ถœํ•˜๋ฏ€๋กœ ์ˆ˜์น˜๊ฐ€ ์ •ํ™•ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

ํ•œํŽธ, SQL ๋ฌธ์˜ ์ตœ์ข… ๊ฒฐ๊ณผ ๊ฑด์ˆ˜์™€ ๋น„๊ตํ•ด rows ์ˆ˜๊ฐ€ ํฌ๊ฒŒ ์ฐจ์ด ๋‚  ๋•Œ๋Š” ๋ถˆํ•„์š”ํ•˜๊ฒŒ MySQL ์—”์ง„๊นŒ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŽ์ด ๊ฐ€์ ธ์™”๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ SQL ํŠœ๋‹์˜ ๋Œ€์ƒ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

EXTRA

SQL ๋ฌธ์„ ์–ด๋–ป๊ฒŒ ์ˆ˜ํ–‰ํ•  ๊ฒƒ์ธ์ง€์— ๊ด€ํ•œ ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ถ€๊ฐ€์ ์ธ ์ •๋ณด๋“ค์€ ์„ธ๋ฏธ์ฝœ๋ก (;)์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ •๋ณด๋ฅผ ๋‚˜์—ดํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์•ฝ 30์—ฌ ๊ฐ€์ง€ ํ•ญ๋ชฉ์œผ๋กœ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Distinct

์ค‘๋ณต์ด ์ œ๊ฑฐ๋˜์–ด ์œ ์ผํ•œ ๊ฐ’์„ ์ฐพ์„ ๋•Œ ์ถœ๋ ฅ๋˜๋Š” ์ •๋ณด์ž…๋‹ˆ๋‹ค. ์ค‘๋ณต ์ œ๊ฑฐ๊ฐ€ ํฌํ•จ๋˜๋Š” DISTINCT ํ‚ค์›Œ๋“œ๋‚˜ UNION ๊ตฌ๋ฌธ์ด ํฌํ•จ๋œ ๊ฒฝ์šฐ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

Using where

์‹คํ–‰ ๊ณ„ํš์—์„œ ์ž์ฃผ ๋ณผ ์ˆ˜ ์žˆ๋Š” extra ์ •๋ณด์ž…๋‹ˆ๋‹ค. ์ด๋Š” WHERE ์ ˆ์˜ ํ•„ํ„ฐ ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•ด MySQL ์—”์ง„์œผ๋กœ ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•  ๊ฒƒ์ด๋ผ๋Š” ์˜๋ฏธ๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Using temporary

๋ฐ์ดํ„ฐ์˜ ์ค‘๊ฐ„ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์ž„์‹œ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ์ €์žฅํ•œ ๋’ค์— ์ •๋ ฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๋Š” ์ž‘์—… ๋“ฑ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋ณดํ†ต DISTINCT, GROUP BY, ORDER BY ๊ตฌ๋ฌธ์ด ํฌํ•จ๋œ ๊ฒฝ์šฐ Using temporary ์ •๋ณด๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

์ž„์‹œ ํ…Œ์ด๋ธ”์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜, ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ์ดˆ๊ณผํ•˜์—ฌ ๋””์Šคํฌ์— ์ž„์‹œ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๋ฉด Using temporary๋Š” ์„ฑ๋Šฅ ์ €ํ•˜์˜ ์›์ธ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ด ํ•ญ๋ชฉ์˜ ์ •๋ณด๊ฐ€ ์ถœ๋ ฅ๋˜๋Š” ์ฟผ๋ฆฌ๋Š” SQL ํŠœ๋‹์˜ ๋Œ€์ƒ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Using index

๋ฌผ๋ฆฌ์ ์ธ ๋ฐ์ดํ„ฐ ํŒŒ์ผ์„ ์ฝ์ง€ ์•Š๊ณ  ์ธ๋ฑ์Šค๋งŒ์„ ์ฝ์–ด์„œ SQL ๋ฌธ์˜ ์š”์ฒญ ์‚ฌํ•ญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ช… ์ปค๋ฒ„๋ง ์ธ๋ฑ์Šค(covering index) ๋ฐฉ์‹์ด๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ, ์ธ๋ฑ์Šค๋กœ ๊ตฌ์„ฑ๋œ ์—ด๋งŒ SQL ๋ฌธ์—์„œ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์ด ๋ฐฉ์‹์„ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ฌผ๋ฆฌ์ ์œผ๋กœ๋„ ํ…Œ์ด๋ธ”๋ณด๋‹ค ์ธ๋ฑ์Šค๊ฐ€ ์ž‘๊ณ  ์ •๋ ฌ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์ ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ๋•Œ ์„ฑ๋Šฅ ์ธก๋ฉด์—์„œ ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.

Using filesort

์ •๋ ฌ์ด ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ฆฌ๊ณ  ์ •๋ ฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

๋ณดํ†ต ์ด๋ฏธ ์ •๋ ฌ๋œ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ถ”๊ฐ€์ ์ธ ์ •๋ ฌ ์ž‘์—…์ด ํ•„์š” ์—†์ง€๋งŒ, ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•  ๋•Œ๋Š” ์ •๋ ฌ์„ ์œ„ํ•ด ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฌ๋ฆฌ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€์ ์ธ ์ •๋ ฌ ์ž‘์—…์ด๋ฏ€๋กœ ์ธ๋ฑ์Šค๋ฅผ ํ™œ์šฉํ•˜๋„๋ก SQL ํŠœ๋‹ ๊ฒ€ํ†  ๋Œ€์ƒ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Using join buffer

์กฐ์ธ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์ค‘๊ฐ„ ๋ฐ์ดํ„ฐ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๋Š” ์กฐ์ธ ๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

์ฆ‰, ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ์— ๋จผ์ € ์ ‘๊ทผํ•œ ๊ฒฐ๊ณผ๋ฅผ ์กฐ์ธ ๋ฒ„ํผ์— ๋‹ด๊ณ  ๋‚œ ๋’ค, ์กฐ์ธ ๋ฒ„ํผ์™€ ๋“œ๋ฆฌ๋ธ ํ…Œ์ด๋ธ” ๊ฐ„์—์„œ ์ผ์น˜ํ•˜๋Š” ์กฐ์ธ ํ‚ค ๊ฐ’์„ ์ฐพ๋Š” ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Using index condition

MySQL ์—”์ง„์—์„œ ์ธ๋ฑ์Šค๋กœ ์ƒ์„ฑ๋œ ์—ด์˜ ํ•„ํ„ฐ ์กฐ๊ฑด์— ๋”ฐ๋ผ ์š”์ฒญ๋œ ๋ฐ์ดํ„ฐ๋งŒ ํ•„ํ„ฐ๋งํ•˜๋Š” Using where ๋ฐฉ์‹๊ณผ ๋‹ฌ๋ฆฌ, ํ•„ํ„ฐ ์กฐ๊ฑด์„ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์œผ๋กœ ์ „๋‹ฌํ•˜์—ฌ ํ•„ํ„ฐ๋ง ์ž‘์—…์— ๋Œ€ํ•œ MySQL ์—”์ง„์˜ ๋ถ€ํ•˜๋ฅผ ์ค„์ด๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

์ด๋Š” ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์˜ ๋ฐ์ดํ„ฐ ๊ฒฐ๊ณผ๋ฅผ MySQL ์—”์ง„์œผ๋กœ ์ „์†กํ•˜๋Š” ๋ฐ์ดํ„ฐ ์–‘์„ ์ค„์—ฌ ์„ฑ๋Šฅ ํšจ์œจ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋Š” ์˜ตํ‹ฐ๋งˆ์ด์ €์˜ ์ตœ์ ํ™” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

Not exists

Not exists๋Š” ํ•˜๋‚˜์˜ ์ผ์น˜ํ•˜๋Š” ํ–‰์„ ์ฐพ์œผ๋ฉด ์ถ”๊ฐ€๋กœ ํ–‰์„ ๋” ๊ฒ€์ƒ‰ํ•˜์ง€ ์•Š์•„๋„ ๋  ๋•Œ ์ถœ๋ ฅ๋˜๋Š” ์œ ํ˜•์ž…๋‹ˆ๋‹ค.

ํ•ด๋‹น ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ์™ผ์ชฝ ์™ธ๋ถ€ ์กฐ์ธ ๋˜๋Š” ์˜ค๋ฅธ์ชฝ ์™ธ๋ถ€ ์กฐ์ธ์—์„œ ํ…Œ์ด๋ธ”์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๊ฒ€์ƒ‰ํ•  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.


Tuning Decision

์‹คํ–‰ ๊ณ„ํš์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ถœ๋ ฅ๋œ ์ •๋ณด๋ฅผ ์‚ดํŽด๋ณด์•˜์„ ๋•Œ, SQL ํŠœ๋‹ ๋Œ€์ƒ์ธ ์‹คํ–‰ ๊ณ„ํš๊ณผ ํŠœ๋‹์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ์‹คํ–‰ ๊ณ„ํš์„ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„ํ•˜๊ธฐ๋ž€ ์–ด๋ ค์šด ์ž‘์—…์ž…๋‹ˆ๋‹ค.

์ด๋•Œ ๊ฒ€ํ†  ๋Œ€์ƒ์ธ ์‹คํ–‰ ๊ณ„ํš ์—ด์€ select_type, type, extra์ž…๋‹ˆ๋‹ค.

์‹คํ–‰ ๊ณ„ํš ์ˆ˜ํ–‰

EXPLAIN FORMAT = TRADITIONAL

๊ธฐ๋ณธ์ ์ธ ์‹คํ–‰ ๊ณ„ํš์€ EXPLAIN ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž…๋ ฅํ•˜๋ฉฐ, ๊ธฐ๋ณธ ํฌ๋งท์€ TRADITIONAL์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ช…์‹œํ•˜์ง€ ์•Š์•„๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ธฐ๋ณธ์ ์ธ ์‹คํ–‰ ๊ณ„ํš ์ •๋ณด๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

EXPLAIN FORMAT = TREE

ํŠธ๋ฆฌ ํ˜•ํƒœ๋กœ ์ถ”๊ฐ€๋œ ์‹คํ–‰ ๊ณ„ํš ํ•ญ๋ชฉ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ˜•์‹์€ ์ฟผ๋ฆฌ์˜ ์‹คํ–‰ ๊ณ„ํš์„ ๋ณด๋‹ค ์‹œ๊ฐ์ ์œผ๋กœ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

EXPLAIN FORMAT = JSON

JSON ํ˜•ํƒœ๋กœ ์ถ”๊ฐ€๋œ ์‹คํ–‰ ๊ณ„ํš ํ•ญ๋ชฉ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ˜•์‹์€ ์ฟผ๋ฆฌ์˜ ์‹คํ–‰ ๊ณ„ํš์„ ๊ตฌ์กฐํ™”๋œ JSON ๋ฐ์ดํ„ฐ๋กœ ์ œ๊ณตํ•˜์—ฌ, ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‰ฝ๊ฒŒ ํŒŒ์‹ฑํ•˜๊ณ  ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

EXPLAIN PARTITIONS

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

3. ์‹คํ–‰ ๊ณ„ํš ์ตœ์ ํ™”

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

CREATE INDEX idx_department_id ON employees(department_id);

3.2. ์กฐ์ธ ์ตœ์ ํ™” ์กฐ์ธ ์ˆœ์„œ์™€ ์ „๋žต์„ ์ตœ์ ํ™”ํ•˜๋ฉด ์ฟผ๋ฆฌ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. MySQL์€ Nested Loop ์กฐ์ธ์„ ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์กฐ์ธ ์ˆœ์„œ๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SELECT e.name, d.department_name
FROM employees e
JOIN departments d ON e.department_id = d.department_id;

3.3. ์ฟผ๋ฆฌ ์žฌ์ž‘์„ฑ ์ฟผ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๊ฐœ์„ ํ•˜์—ฌ ์‹คํ–‰ ๊ณ„ํš์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ์กฐ์ธ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜, ๋ถˆํ•„์š”ํ•œ ์ปฌ๋Ÿผ์„ ์ œ๊ฑฐํ•˜์—ฌ ์ฟผ๋ฆฌ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

-- ์„œ๋ธŒ์ฟผ๋ฆฌ ์˜ˆ์‹œ
SELECT name FROM employees WHERE department_id IN (SELECT department_id FROM departments WHERE location = 'New York');

-- ์กฐ์ธ์œผ๋กœ ๋ณ€๊ฒฝ
SELECT e.name
FROM employees e
JOIN departments d ON e.department_id = d.department_id
WHERE d.location = 'New York';

4. ๊ณ ๊ธ‰ ์ฃผ์ œ

4.1. ์‹คํ–‰ ๊ณ„ํš ์บ์‹œ MySQL์€ ์‹คํ–‰ ๊ณ„ํš์„ ์บ์‹œํ•˜์—ฌ ๋ฐ˜๋ณต์ ์ธ ์ฟผ๋ฆฌ์˜ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋™์ผํ•œ ์ฟผ๋ฆฌ์— ๋Œ€ํ•ด ์‹คํ–‰ ๊ณ„ํš์„ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4.2. ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ MySQL Workbench, Percona Toolkit, pt-query-digest ๋“ฑ์˜ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฟผ๋ฆฌ ์„ฑ๋Šฅ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4.3. MySQL ์ตœ์‹  ๋ฒ„์ „ ๊ธฐ๋Šฅ MySQL ์ตœ์‹  ๋ฒ„์ „์—์„œ๋Š” ์‹คํ–‰ ๊ณ„ํš๊ณผ ๊ด€๋ จ๋œ ์—ฌ๋Ÿฌ ๊ฐœ์„  ์‚ฌํ•ญ์ด ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋” ๋‚˜์€ ์„ฑ๋Šฅ์„ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Last updated