๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๋ชฉ๋ก์ด ์—†์Šต๋‹ˆ๋‹ค.

[MySQL] EXPLAIN ์‚ฌ์šฉํ•˜์—ฌ ์ฟผ๋ฆฌ ์ตœ์ ํ™”

๐Ÿ›ข DB/MySQL

    EXPLAIN ๋ช…๋ น๋ฌธ์€ MySQL์ด SELECT ๋ช…๋ น๋ฌธ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ •๋ณด๋ฅผ ์–ป๊ธฐ ์œ„ํ•œ ์ˆ˜๋‹จ์ด๋‹ค.


    EXPLAIN ํ…Œ์ด๋ธ”๋ช… ์€ DESCRIBE ํ…Œ์ด๋ธ”๋ช… ๋˜๋Š” SHOW COLUMS FROM ํ…Œ์ด๋ธ”๋ช… ๊ณผ ๊ฐ™์€ ์˜๋ฏธ์ด๋‹ค.


    EXPLAIN์€ SELECT ๋ช…๋ น๋ฌธ์—์„œ ์‚ฌ์šฉ๋œ ๊ฐ ํ…Œ์ด๋ธ” ์ •๋ณด๋ฅผ ๋ฆฌํ„ดํ•˜๋Š”๋ฐ MySQL์ด ์ฟผ๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋™์•ˆ ์ฝ์„ ์ˆ˜ ์žˆ๋„๋ก ๊ฒฐ๊ณผ๋ฌผ ์•ˆ์— ํ…Œ์ด๋ธ”๋“ค์ด ๋ชฉ๋ก์œผ๋กœ ์ •๋ฆฌ ๋œ๋‹ค.


    EXTENDED ํ‚ค์›Œ๋“œ๊ฐ€ ์‚ฌ์šฉ๋˜๋ฉด, EXPLAIN์€ EXPLAIN ๋ช…๋ น๋ฌธ ๋‹ค์Œ์— SHOW WARNINGS ๋ช…๋ น๋ฌธ์„ ์ž…๋ ฅํ•ด์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ธฐํƒ€ ์ •๋ณด๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค. ์ด ์ •๋ณด๋Š” ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ SELECT ๋ช…๋ น๋ฌธ์— ์žˆ๋Š” ์ปฌ๋Ÿผ ์ด๋ฆ„๊ณผ ํ…Œ์ด๋ธ”์„ ์–ผ๋งˆ๋‚˜ ๋งŽ์ด ๊ฒ€์ฆ์„ ํ•˜์˜€๋Š”์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๋ฉฐ, SELECT๋Š” ์ตœ์ ํ™” ๊ณผ์ •์— ๊ด€ํ•œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์žฌ ์ž‘์„ฑ๊ณผ ์ตœ์ ํ™” ๊ทœ์น™, ๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ๊ฐ€๋Šฅํ•œ ๋…ธํŠธ(notes)๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.


    ์‚ฌ์šฉ ์˜ˆ์ œ ๋ฐ ๊ฒฐ๊ณผ


    id 

    select_type 

    table 

    type 

    possible_keys 

    key 

    key_len

    ref 

    rows 

    Extra 

    SIMPLE 

    table_name 

    ref 

    idx_table_sri, idx_table_list_order, idx_table_up... 

    idx_table_status 

    const 

    34 

     




    ์˜ต์…˜


    ์˜ต์…˜ 

    ์„ค๋ช… 

     table

    ๊ฒฐ๊ณผ ์—ด์ด ์ฐธ์กฐํ•˜๋Š” ํ…Œ์ด๋ธ” 

    type 

    ์กฐ์ธ(join) ํƒ€์ž…. ์„œ๋กœ ๋‹ค๋ฅธ ํƒ€์ž…์˜ ์กฐ์ธ์ด ์•„๋ž˜์— ์žˆ๋Š”๋ฐ, ๊ฐ€์žฅ ์ข‹์€๊ฒƒ๋ถ€ํ„ฐ ๊ฐ€์žฅ ๋‚˜์œ ๊ฒƒ์˜ ์ˆœ์„œ๋กœ ๋˜์–ด ์žˆ๋‹ค. 

     system : ํ…Œ์ด๋ธ”์ด ํ•˜๋‚˜์˜ ๋ ˆ์ฝ”๋“œ๋งŒ ๊ฐ€์ง€๋Š” ๊ฒฝ์šฐ
    const : ํ…Œ์ด๋ธ”์— ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๊ฐ€ ํ•˜๋‚˜์ผ ๋•Œ. ์ƒ์ˆ˜์ทจ๊ธˆ
    eq_ref : ์ธ๋ฑ์Šค๊ฐ€ UNIQUE์ด๊ฑฐ๋‚˜ PRIMARY KEY์ธ ๊ฒฝ์šฐ์˜ ์กฐ์ธ์œผ๋กœ const๋ฅผ ์ œ์™ธํ•œ ์กฐ์ธ ์ค‘ ๊ฐ€์žฅ ์ข‹์€ ํ˜•ํƒœ

    ref : eq_ref์™€ ๋‹ค๋ฅธ ์ ์€ UNIQUE๊ฐ€ ์•„๋‹ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ.

    range : ์กฐ๊ฑด์— ๋ ˆ์ฝ”๋“œ์˜ ๋ฒ”์œ„๊ฐ€ ์ฃผ์–ด์ง„ ์กฐ์ธ.

    index : all  ํ˜•ํƒœ์™€ ๋น„์Šทํ•˜๋ฉฐ, ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

    all : ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ๋ฅผ ์Šค์บ”ํ•œ๋‹ค.

     possible_keys

    ์ปฌ๋Ÿผ์€ ์ด ํ…Œ์ด๋ธ”์—์„œ ์—ด์„ ์ฐพ๊ธฐ ์œ„ํ•ด MySQL์ด ์„ ํƒํ•œ ์ธ๋ฑ์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ์ด ์ปฌ๋Ÿผ์€ EXPLAIN ๊ฒฐ๊ณผ์—์„œ ๋‚˜ํƒ€๋‚˜๋Š” ํ…Œ์ด๋ธ” ์ˆœ์„œ์™€๋Š” ์ „์ ์œผ๋กœ ๋ณ„๊ฐœ์˜ ์ˆœ์„œ๊ฐ€ ๋œ๋‹ค. ์ด๊ฒƒ์€ possible_keys์— ์žˆ๋Š” ํ‚ค ์ค‘์— ์–ด๋–ค ๊ฒƒ๋“ค์€ ํ…Œ์ด๋ธ” ์ˆœ์„œ๋ฅผ ๋งŒ๋“œ๋Š” ๊ณผ์ •์—์„œ๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Œ์„ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋งŒ์ผ ์ด ์ปฌ๋Ÿผ ๊ฐ’์ด NULL์ด๋ผ๋ฉด, ์—ฐ๊ด€๋œ ์ธ๋ฑ์Šค๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๊ฒŒ ๋œ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ ์ฟผ๋ฆฌ ์ œ์ž‘์ž๋Š” WHERE ๊ตฌ๋ฌธ์„ ๊ฒ€์‚ฌํ•˜์—ฌ ์ด ๊ตฌ๋ฌธ์ด ์ธ๋ฑ์Šค ํ•˜๊ธฐ์— ์ ๋‹นํ•œ ์ปฌ๋Ÿผ์„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์•Œ์•„ ๋ด„์œผ๋กœ์จ ์ฟผ๋ฆฌ ์†๋„๋ฅผ ๊ฐœ์„  ์‹œํ‚ฌ ์ˆ˜๊ฐ€ ์žˆ๊ฒŒ ๋œ๋‹ค. ๊ทธ๋Ÿฌํ•œ ๊ฒฝ์šฐ๋ผ๋ฉด, ์ ์ ˆํ•œ ์ธ๋ฑ์Šค๋ฅผ ํ•˜๋‚˜ ์ƒ์„ฑํ•œ ํ›„์—, EXPLAIN์„ ๋‹ค์‹œ ์‚ฌ์šฉํ•ด์„œ ์ฟผ๋ฆฌ๋ฅผ ๊ฒ€์‚ฌํ•œ๋‹ค. ํ…Œ์ด๋ธ”์ด ์–ด๋–ค ์ธ๋ฑ์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€๋ฅผ ๋ณด๊ธฐ ์œ„ํ•ด์„ , SHOW INDEX FROM [ํ…Œ์ด๋ธ”๋ช…] ์„ ์‚ฌ์šฉํ•œ๋‹ค. 

     key

    possible_keys์— ๋‚˜์˜จ ํ‚ค ์ค‘์—์„œ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•œ ํ‚ค๋กœ MySQL์ด ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•  ์˜ˆ์ •์ธ ํ‚ค(์ธ๋ฑ์Šค)๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

    ๋งŒ์ผ ์•„๋ฌด๋Ÿฐ ์ธ๋ฑ์Šค๋„ ์„ ํƒ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด, ๊ทธ ํ‚ค๋Š” NULL์ด ๋œ๋‹ค.

    MySQL๋กœ ํ•˜์—ฌ๊ธˆ possible_keys ์ปฌ๋Ÿผ์— ์žˆ๋Š” ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋˜๋Š” ๋ฌด์‹œํ•˜๋„๋ก ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ, FORCE INDEX, USE INDEX ๋˜๋Š” IGNORE INDEX๋ฅผ ์ฟผ๋ฆฌ์—์„œ ์‚ฌ์šฉํ•˜๋„๋ก ํ•œ๋‹ค. MyISAM ๋ฐ BDB ํ…Œ์ด๋ธ”์˜ ๊ฒฝ์šฐ์—๋Š” ANALYZE TABLE์„ ๊ตฌ๋™์‹œํ‚ค๋ฉด ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ๋ณด๋‹ค ์ข‹์€ ์ธ๋ฑ์Šค๋ฅผ ์„ ํƒํ•˜๋„๋ก ๋„์›€์„ ์ค„ ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

    MyISAM ํ…Œ์ด๋ธ”์˜ ๊ฒฝ์šฐ์—๋Š” myisamchk --analyze ๊ฐ€ ๋™์ผํ•œ ์—ญํ• ์„ ํ•œ๋‹ค. 

     key_len

    MySQL์ด ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ ํ‚ค์˜ ๊ธธ์ด๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๋งŒ์ผ key ์ปฌ๋Ÿผ์ด NULL์ด๋ผ๋ฉด, ์ด ๊ฐ’๋„ NULL์ด ๋œ๋‹ค.

    key_len ๊ฐ’์€ ๋‹ค์ค‘-๋ถ€๋ถ„(multiple-part) ํ‚ค ์ค‘์— ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๋ถ€๋ถ„์„ MySQL์ด ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋Š”์ง€๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. 

    ref 

    ํ…Œ์ด๋ธ”์—์„œ ์—ด์„ ์„ ํƒํ•˜๊ธฐ ์œ„ํ•ด key ์ปฌ๋Ÿผ ์•ˆ์— ๋ช…๋ช…๋˜์–ด ์žˆ๋Š” ์ธ๋ฑ์Šค๋ฅผ ์–ด๋–ค ์ปฌ๋Ÿผ ๋˜๋Š” ์ƒ์ˆ˜(constant)์™€ ๋น„๊ตํ•˜๋Š”์ง€๋ฅผ ๋ณด์—ฌ์ค€๋‹ค. 

    rows 

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

    Extra 

    MySQL์ด ์ฟผ๋ฆฌ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด์„ํ•˜๋Š”์ง€์— ๊ด€ํ•œ ์ถ”๊ฐ€์ ์ธ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•œ๋‹ค. 

     distinct : ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฐพ์•˜์„ ๋•Œ ๊ฐ™์€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•˜์ง€ ์•Š์Œ.

    not exist : left join ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ํ•˜๋‚˜์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฐพ์•˜์„ ๋•Œ ๋‹ค๋ฅธ ๋ ˆ์ฝ”๋“œ์˜ ์กฐํ•ฉ์€ ๋” ์ด์ƒ ๊ฒ€์‚ฌํ•˜์ง€ ์•Š์Œ.

    range checked for each record : ์ตœ์ ์˜ ์ธ๋ฑ์Šค๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ฐจ์„ ์˜ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•จ.

    using filesort : MySQL์ด ์ •๋ ฌ์„ ๋น ๋ฅด๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ๋ถ€๊ฐ€์ ์ธ ์ผ์„ ํ•จ.

    using index : SELECTํ•  ๋•Œ ์ธ๋ฑ์Šค ํŒŒ์ผ๋งŒ ์‚ฌ์šฉ.

    using temporary : ์ž„์‹œ ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•œ๋‹ค. order by ๋‚˜ group by ํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ.

    where used : ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•จ.