Mysql explain
Explain
์ฟผ๋ฆฌ ์์ explain์ ์ถ๊ฐํ๋ฉด SQL๋ฌธ์ ๋ํด์ ์ด๋ป๊ฒ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ๊ฒ์ธ์ง์ ๋ํ ๊ณํ, ๊ฒฝ๋ก๋ฅผ ๋ํ๋ธ๋ค.
explain์ ๊ฒฐ๊ณผ๋ MySQL์์ ์คํ๋ ์ฟผ๋ฆฌ์ ์คํ ๊ณํ์ ๋ณด์ฌ์ค๋ค.
๊ฒฐ๊ณผ์๋ ์๋์ ๊ฐ์ ์ปฌ๋ผ์ด ํฌํจ๋์ด ์๋ค.

id
id๋ ์ฟผ๋ฆฌ์ ์คํ ์์๋ฅผ ๋ํ๋ธ๋ค. id ๊ฐ์ด ๋ฎ์์๋ก ๋จผ์ ์คํ๋๊ณ , ๊ฐ์ด ๋์์๋ก ๋์ค์ ์คํ๋๋ค.
select_type
์ด๋ค ์ข ๋ฅ์ SELECT ๋ฌธ์ธ์ง ๋ํ๋ธ๋ค.
SIMPLE: ์๋ธ์ฟผ๋ฆฌ, UNION์ด ํฌํจ๋์ง ์์ ๋จ์ํ SELECT ๋ฌธ์ด๋ค.PRIMARY: ์ต์์ SELECT ๋ฌธ์ ๋ํ๋ธ๋ค. ์ฃผ๋ก ์๋ธ์ฟผ๋ฆฌ๋ UNION์ด ํฌํจ๋ ์ฟผ๋ฆฌ์์ ์ด๋ค์ ๊ฐ์ธ๋ ์ธ๋ถ ์ฟผ๋ฆฌ์ด๋ฉฐ, ์ต์์ ๋ ๋ฒจ์ ์ฟผ๋ฆฌ๋ฅผ ๋ํ๋ธ๋ค.SUBQUERY: ๋ ๋ฆฝ์ ์ผ๋ก ์ํ๋๋ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ๋ํ๋ธ๋ค. ์ธ๋ถ SELECT ๋ฌธ์ ์ปจํ ์คํธ ๋ด์์ ๋ฐ์ดํฐ๋ฅผ ํํฐ๋งํ๊ฑฐ๋ ์ง๊ณํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ผ๋ฉฐ, ์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ์ WHERE ์ ์ ์ค์ฒฉ ์๋ธ์ฟผ๋ฆฌ์ผ ๊ฒฝ์ฐ ํ์๋๋ค.DERIVED: MySQL์์ ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฅผ ์ผ์์ ์ธ ํ์ ํ ์ด๋ธ๋ก ๋ง๋ค์ด ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ฅผ ๋ํ๋ด๋ ํ์ ์ด๋ค. ํ์ ํ ์ด๋ธ์ ์๋ธ์ฟผ๋ฆฌ ๋๋ UNION์ ์์ ๊ฒฐ๊ณผ๋ก ์์ฑ๋ ์์ ํ ์ด๋ธ์ ๋ํ๋ธ๋ค. ์ฆ, FROM ์ ์ ์๋ธ์ฟผ๋ฆฌ๊ฐ ํฌํจ๋ ๊ฒฝ์ฐ๋ ํด๋นํ๋ค.UNION: ๋ ์ฟผ๋ฆฌ๋ฅผ UNION ์ฐ์ฐํ ๋, ๋ ๋ฒ์งธ SELECT ๋ฌธ์ด ํด๋นํ๊ฒ ๋๋ค.UNION RESULT: UNION ์ฐ์ฐ์ ์ต์ข ๊ฒฐ๊ณผ๋ฅผ ๋ํ๋ด๋ ๊ฐ์์ ํ ์ด๋ธ์ ์๋ฏธํ๋ค. ์ฆ, ๋ SELECT ๋ฌธ์ ์กฐํฉํ ๊ฒฐ๊ณผ์์ ์๋ฏธํ๋ค.DEPENDENT SUBQUERY: ์์(์ธ๋ถ) ์ฟผ๋ฆฌ์ ์ด์ ์์กดํ๋ ์๋ธ์ฟผ๋ฆฌ์ด๋ค. ์๋ธ์ฟผ๋ฆฌ๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ์คํ๋์ง ๋ชปํ๊ณ where๊ณผ ๊ฐ์ ์ธ๋ถ ํ ์ด๋ธ๋ก๋ถํฐ ์ํฅ์ ๋ฐ๋๋ค. โ ์ฑ๋ฅ์ ์ผ๋ก ๋ถ๋ฆฌํ SQL๋ฌธ์ด๋ผ๊ณ ํ๋ค.
์ฌ๊ธฐ ์์ฑ๋ ๊ฒ ๋ง๊ณ ๋ ๋ ๋ง์ ํ์ ๋ค์ด ์กด์ฌํ๋ค.
table
ํ์ฌ ์คํ์ด ์ฐธ์กฐํ๋ table์ ์ด๋ฆ์ด๋ as๋ฅผ ๋ํ๋ธ๋ค. ์๋ธ์ฟผ๋ฆฌ๋ ํ์ ํ ์ด๋ธ์ ์ฐธ์กฐํ ๊ฒฝ์ฐ <subquery#>, <derived#>์ ์ฌ์ฉํ๋ค.
EXPLAIN SELECT * FROM ( SELECT id, name FROM users ) AS derived_table;์ฟผ๋ฆฌ๋ฅผ ์คํ ํ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ค๋ค.
partitions
์ฟผ๋ฆฌ์ ์ ๊ทผํ๋ ํํฐ์ ์ ๋ํ๋ธ๋ค.
type
ํ ์ด๋ธ์ ์ ๊ทผํ๋ ๋ฐฉ๋ฒ์ ๋ํ๋ธ๋ค. ์ฟผ๋ฆฌ ์ฑ๋ฅ์ ๋ถ์ํ๊ณ ์ต์ ํ ํ๋๋ฐ ์ค์ํ ์ ๋ณด์ด๋ฉฐ, system, const, eq_ref, ref, range, index ALL ์์๋ก ์ฑ๋ฅ์ด ์ข๋ค.
์ ๊ทผ ์ ํ
system: ๋จ ํ๋์ ํ๋ง ์๋ ํ ์ด๋ธ์ ๋ํ ์ ๊ทผ์ ๋ํ๋ธ๋ค. ๊ฐ์ฅ ๋น ๋ฅธ ์ ๊ทผ ๋ฐฉ๋ฒ์ด๋ฉฐ, ํ์ด ํ๋๋ฟ์ธ ํ ์ด๋ธ์์ SELECT๋ฅผ ์คํํ๋ ๊ฒฝ์ฐ์ ๋ํ๋๋ค.
const: ์์์ฒ๋ผ ์ทจ๊ธ๋๋ ํ ์ด๋ธ์ ๋ํ ์ ๊ทผ์ ๋ํ๋ธ๋ค. ์ผ๋ฐ์ ์ผ๋ก PK๋ ์ ๋ํฌ ์ธ๋ฑ์ค์ ์ ํํ ๊ฐ์ ์กฐํํ ๋ ์ฌ์ฉ๋๋ค. ์ฆ, ์ธ๋ฑ์ค๋ PK๋ฅผ ์ฌ์ฉํด์ 1๊ฑด์ ๋ฐ์ดํฐ๋ง ์ป์ ๊ฒฝ์ฐ ํ์๋๋ค. ex) select * from users where id = 1;
eq_ref: Join์์ PK๋ ์ ๋ํฌ index๋ฅผ ์ฌ์ฉํ์ฌ ์ ํํ ํ๋์ ํ์ ์กฐํํ ๋ ๋ํ๋ธ๋ค. ์กฐ์ธ ์, ๋๋ผ์ด๋น ํ ์ด๋ธ์ด ๋๋ฆฌ๋ธ ํ ์ด๋ธ์ ์ ๊ทผํด์ PK๋ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ฌ 1๊ฑด์ ๋ฐ์ดํธ ์ป๋ ๊ฒฝ์ฐ ํ์๋๋ค. ex) select * from orders join customers on orders.customer_id = customers.id; (์ฌ๊ธฐ์ customers.id๊ฐ PK์ผ ๋)
ref: non-clusterd index ๋๋ ์ธ๋ ํค๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ํ์ ์กฐํํ ๋ ๋ํ๋ธ๋ค. โ ์ธ๋ฑ์ค ํน์ ์ธ๋ ํค๊ฐ ์ค์ ๋ ์ปฌ๋ผ์ where ์กฐ๊ฑด์ ์ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ํ์ ์กฐํํ ๋ ํํ ex) select * from ์์ where type = โ๊ณผ์ผโ (์ฌ๊ธฐ์ type์ index)
range: ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํด์ ๋ฒ์ ๊ฒ์์ ์ํํ ๋ ์ฌ์ฉ๋๋ค. BETWEENT, >, <, โฅ, โค ๋ฑ์ ์กฐ๊ฑด์ ์ฌ์ฉํ ๋ ํํํ๋ค. (์ธ๋ฑ์ค๊ฐ ์์ฑ๋์ง ์์ ์ปฌ๋ผ์ผ๋ก ์กฐํํ ๋, range๋ก ํํ๋์ง ์์)
index: ์ธ๋ฑ์ค ์ ์ฒด๋ฅผ ์ค์บํ ๋ ํํํ๋ค. ์ธ๋ฑ์ค ์ ์ฒด ์ค์บ์ ํ ์ด๋ธ ์ ์ฒด ์ค์บ๋ณด๋ค ๋น ๋ฅด์ง๋ง ์ฌ์ ํ ๋ง์ ํ์ ์ฝ์ด์ผ ํ๋ค.
ALL: ํ ์ด๋ธ์ ๋ํด์ ์ ์ฒด ์ค์บ ํ ๊ฒฝ์ฐ ํํํ๋ค. ๋ฐ์ดํฐ๊ฐ ๋ง์ ๋ ์ผ๋ฐ์ ์ผ๋ก ์ฑ๋ฅ์ด ๊ฐ์ฅ ์ข์ง ์์ ๋ฐฉ๋ฒ์ด๋ค.
possible_keys
์ฟผ๋ฆฌ์์ ์ฌ์ฉํ ์ ์๋ ์ธ๋ฑ์ค ๋ชฉ๋ก์ ๋ํ๋ธ๋ค.
<auto_key0>๋ MySQL์ด ๋ด๋ถ์ ์ผ๋ก ์๋ ์์ฑํ ์์ ์ธ๋ฑ์ค๋ฅผ ํ๋๋ธ๋ค.
key
์ค์ ๋ก ์ฌ์ฉ๋ ์ธ๋ฑ์ค๋ฅผ ๋ํ๋ธ๋ค.
possible_key๋ ์ฟผ๋ฆฌ์์ ์ฌ์ฉํ ์ ์๋ ์ธ๋ฑ์ค๋ฅผ ๋ํ๋ด๊ณ , key๋ ์ค์ ์ฌ์ฉ๋ ์ธ๋ฑ์ค๋ฅผ ๋ํ๋ด๊ธฐ ๋๋ฌธ์ possible_key๊ฐ null ์ด๋๋ผ๋, key๋ null์ด ์๋ ์ ์๋ค.
key_len
์ฌ์ฉ๋ ์ธ๋ฑ์ค์ ๊ธธ์ด๋ฅผ ๋ํ๋ธ๋ค. ์ธ๋ฑ์ค์ ํฌ๊ธฐ๋ byte ๋จ์๋ก ํํํ๋ค.
์ธ๋ฑ์ค๋ฅผ ์์ฑํ ์ปฌ๋ผ์ ์คํค๋ง๊ฐ varchar(50)์ผ๋ก ์ ์ ๋์๋ค๋ฉด 50 * 4 + ์ค๋ฒํค๋ = 202. ์ฆ, key_len = 202 ๋ก ํํํ ์ ์๋ค.
ref
์กฐ์ธ ์กฐ๊ฑด์ ์ฌ์ฉ๋ ์ปฌ๋ผ์ ๋ํ๋ธ๋ค.
์ง์ ์ ์ผ๋ก ์กฐ์ธํ์ง ์๋๋ผ๋ ์๋ธ ์ฟผ๋ฆฌ๊ฐ์ ๊ฒฝ์ฐ where ์กฐ๊ฑด์ ์์ ์ธ๋ถ ํ ์ด๋ธ์ ์ฐธ์กฐํ๊ณ ์์ผ๋ฉด ref์ ํํ๋ ์ ์๋ค. (์๋ธ ์ฟผ๋ฆฌ๊ฐ ์ธ๋ถ ์ฟผ๋ฆฌ๋ฅผ ์ฐธ์กฐํ๊ณ ์๋ค๋ฉด ํํ ๊ฐ๋ฅ)
rows
ํด๋น ๋จ๊ณ์์ MySQL์ด ์ฒ๋ฆฌํ ์ ์๋ ์์ row๋ฅผ ํํํ๋ค. (ํด๋น ์ฟผ๋ฆฌ๊ฐ ์ ๊ทผํ๋ row)
filtered
์คํ ๋ SQL๋ฌธ์ด ์คํ ๋ฆฌ์ง ์์ง โ MySQL ์์ง์ ๊ฑฐ์น๋ฉด์ ์กฐ๊ฑด์ ๋ํด์ ํํฐ๋ง ๋ ๋น์จ์ ๋ฐฑ๋ถ์จ๋ก ๋ํ๋ธ๋ค.
๋ง์ฝ 1,000๊ฐ์ row ์ค 200๊ฐ์ row๊ฐ ์กฐ๊ฑด์ ์ถฉ์กฑํ๋ค๊ณ ์์๋๋ฉด 20.00์ผ๋ก ํํ๋๋ค. ๋ฐ๋ผ์ ๊ฐ์ด ๋๋ค๋ฉด ์กฐ๊ฑด์ ๋ง์กฑํ๋ ํ์ด ๋ง์์ ์๋ฏธํ๋ค.
์ ์ฒด ์ค์บ์์ ์ด ๊ฐ์ด ๋ฎ๋ค๋ฉด where ์ ์ ๊ฐ์ ํ์ฌ ๋ ๋ง์ ํ์ ํํฐ๋ง ํ ์ ์๋๋ก ์ฑ๋ฅ ๊ฐ์ ์ ๊ณ ๋ คํ ์ ์๋ค.
Extra
Extra๋ ์ฟผ๋ฆฌ ์คํ์ ๋ํด ์ถ๊ฐ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ค. ์ด ์ ๋ณด๋ ์ต์ ํ ๋ฐ ์ฑ๋ฅ ๊ฐ์ ์ ์ค์ํ ์ญํ ์ ํ ์ ์๋ค.
Extra ์ธ๋ถ ์ฌํญ (
Using ~)where: ์ฟผ๋ฆฌ์์ where ์ ์ด ์ฌ์ฉ๋์์์ ์๋ฏธํ๋ค.
index: ์ฟผ๋ฆฌ๊ฐ ์ธ๋ฑ์ค๋ง์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ๊ฒ์ ์๋ฏธํ๋ค. (์ปค๋ฒ๋ง ์ธ๋ฑ์ค ๋ฐฉ์ ์ด๋ผ๊ณ ๋ ํ๋ค.)
temporary: ์ฟผ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ๋ ๋์ ์์ ํ ์ด๋ธ์ด ์ฌ์ฉ๋จ์ ์๋ฏธํ๋ค. ์์ ํ ์ด๋ธ์ ์ฟผ๋ฆฌ ์ฑ๋ฅ์ ์ ํ์ํค๋ ์์ธ์ด ๋ ์ ์๋ค. distinct, group by, order by ๊ตฌ๋ฌธ์ด ํฌํจ๋ ๊ฒฝ์ฐ ํ์ํ๋ค.
filesort: ๊ฒฐ๊ณผ๋ฅผ ์ ๋ ฌํ๊ธฐ ์ํด ์ ๋ ฌ์ด ์ฌ์ฉ๋์์์ ์๋ฏธํ๋ค. distinct, group by, order by, union ๊ตฌ๋ฌธ์ด ์ฌ์ฉ๋ ๋ ํ์๋ ์ ์๋ค. order by๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด, orber by ์ฒ๋ฆฌ๊ฐ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ง ๋ชปํ ๋ ํ์๋๊ณ , ์ฃํ๋ ๋ ์ฝ๋๋ฅผ ๋ฉ๋ชจ๋ฆฌ ๋ฒํผ์ ๋ณต์ฌํด ํต ์ํธ ๋๋ ํ ์ํธ ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํด ์ ๋ ฌ์ ์ํํ๋ค๋ ์๋ฏธ์ด๋ค.
distinct: ์ค๋ณต์ด ์ ๊ฑฐ๋์ด ์ ์ผํ ๊ฐ์ ์ฐพ์ ๊ฒฝ์ฐ๋ฅผ ์๋ฏธํ๋ค. distinct, union์ ์ฌ์ฉํ ๋ ํ์๋ ์ ์๋ค.
indexcondition: ์กฐ๊ฑด์ ๋ํด์ ์ธ๋ฑ์ค ๋ ๋ฒจ์์ ๋จผ์ ํ๊ฐํ๊ณ , ํด๋น ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ฐ์ดํฐ๋ง ์ค์ ํ ์ด๋ธ์์ ์ฝ์ด์ค๊ณ ์์์ ์๋ฏธํ๋ค. ์ด๊ฒ์ MySQL์ด ํจ์จ์ ์ผ๋ก ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๊ณ ์์์ ์๋ฏธํ ์ ์๊ณ ๋ณ๋์ ์ฑ๋ฅ ํ๋์ด ํ์ํ์ง ์์ ๊ฐ๋ฅ์ฑ์ด ๋๋ค.
Backward index scan (Using X): ์ด๋ MySQL์ด index๋ฅผ ์ญ์์ผ๋ก ์ค์บํ์ฌ order by๋ฅผ ์ฒ๋ฆฌํ๊ณ ์์์ ๋ํ๋ด๊ธฐ ๋๋ฌธ์ ๋ณ๋์ ํ์ผ ์ ๋ ฌ(filesort)๊ฐ ํ์ํ์ง ์๋ค.
Last updated