Explain Á¤º¸º¸´Â¹ý
À妽º°¡ ÀûÀýÈ÷ »ç¿ëµÇ°í ÀÖ´ÂÁö °ËÅä ³ª¿µÈ ¼ø¼´Â MYSQL ÀÌ Äõ¸®Ã³¸®¿¡ »ç¿ëÇÏ´Â ¼ø¼´ë·Î Ãâ·Â
EXPLAIN ÀÇ °¢ Çà ¼³¸í
A.
id :
Äõ¸® ó¸® ¼ø¼
B.
select_type:
SELECT
ÀÇ Å¸ÀÔ
(
Á¾·ù)
- SIMPLE:
´Ü¼ø SELECT (UNION À̳ª SUB-QUERY°¡ ¾ø´Â SELECT ¹®)
- PRIMARY:
SUB-QUERY¸¦ »ç¿ëÇÒ °æ¿ì SUB-QUERY ÀÇ ¿ÜºÎ¿¡ ÀÖ´Â Äõ¸®(ù¹ø° Äõ¸®)
UNION À» »ç¿ëÇÒ °æ¿ì UNIONÀÇ Ã¹¹ø° SELECT Äõ¸®.
- UNION:
UNION Äõ¸®¿¡¼ PRIMARY¸¦ Á¦¿ÜÇÑ ³ª¸ÓÁö SELECT
- DEPENDENT UNION:
UNION °ú µ¿ÀÏÇϳª, ¿ÜºÎÄõ¸®¿¡ ÀÇÁ¸ÀûÀÓ (°ªÀ» °ø±Þ ¹ÞÀ½)
- UNION RESULT
UNION Äõ¸®ÀÇ °á°ú¹°
- SUBQUERY:
SUB-QUERY
¶Ç´Â SUB-QUERY¸¦ ±¸¼ºÇÏ´Â ¿©·¯ Äõ¸® Áß Ã¹¹ø° SELECT¹®
- DEPENDENT SUBQUERY:
SUB-QUERY
¿Í µ¿ÀÏÇϳª
, ¿Ü°ûÄõ¸®¿¡ ÀÇÁ¸ÀûÀÓ
(
°ªÀ» °ø±Þ ¹ÞÀ½)
- DERIVED:
SELECT ·Î ÃßÃâµÈ Å×À̺í (FROM Àý ¿¡¼ÀÇ ¼ºêÄõ¸® ¶Ç´Â INLINE VIEW)
- UNCACHEABLE SUBQUERY:
SUB-QUERY¿Í µ¿ÀÏÇÏÁö¸¸, °ø±ÞµÇ´Â ¸ðµç °ª¿¡ ´ëÇØ SUB-QUERY¸¦ Àçó¸®. ¿ÜºÎÄõ¸®¿¡¼ °ø±ÞµÇ´Â °ªÀÌ µ¿ÀÏÇÏ´õ¶óµµ CACHEµÈ °á°ú¸¦ »ç¿ëÇÒ¼ö ¾øÀ½.
- UNCACHEABLE UNION:
UNION
°ú µ¿ÀÏÇÏÁö¸¸, °ø±ÞµÇ´Â ¸ðµç °ª¿¡ ´ëÇÏ¿© UNION Äõ¸®¸¦ Àçó¸®.
C.
table:
table
¸í ȤÀº Alias
D.
type:
data access
ŸÀÔ, ¿ì¼öÇÑ ¼ø¼´ë·Î... µÚ·Î°¥¼ö·Ï ³ª»Û Á¶ÀÎÇüÅÂ
-
system
Å×ÀÌºí¿¡ ¿ÀÁ÷ ÇϳªÀÇ row¸¸ ÀÖ¾î Å×ÀÌºí¿¡¸ÅĪµÇ´Â row°¡ ¹«Á¶°Ç 1°ÇÀÎ °æ¿ì, Const ŸÀÔÀÇ Æ¯º°ÇÑ ÄÉÀ̽º
- const
¸ÅĪµÇ´Â row°¡ ¿ÀÁ÷ 1°ÇÀÎ °æ¿ì
°¡Àå ºü¸¥ °æ¿ìÀ̸ç, ¿ÉƼ¸¶ÀÌÀú°¡ rowÀ» ã±â À§ÇØ Unique/Primary Key »ç¿ë
°¢ Ä÷³ °ªÀº ³ª¸ÓÁö ¿¬»ê¿¡¼ »ó¼ö·Î °£ÁÖ, óÀ½Çѹø¸¸ ÀÐ¾î µéÀÌ¸é µÇ¹Ç·Î ¸Å¿ì ºü¸§
- eq_ref
ÀÌÀü Å×ÀÌºí¿¡¼ °ø±Þ¹ÞÀº °ªÀ¸·Î Á¶ÀΠ󸮽à ´Ü ÇϳªÀÇrow¸¸ÀÌ Á¶ÀεǴ Å×ÀÌºí¿¡ Á¸ÀçÇÏ´Â °æ¿ì
Á¶ÀΠŸÀÔ Áß °ÅÀÇ ÃÖ»óÀÇ °æ¿ìÀ̸ç, Á¶ÀεǴÂÅ×À̺íÀÇ Unique/Primary Key¸¦ »ç¿ë (1:1 °ü°è)
- ref
ÀÌÀü Å×ÀÌºí¿¡¼ °ø±Þ¹ÞÀº °ªÀ¸·Î Á¶ÀΠ󸮽à Çϳª ÀÌ»óÀÇrow°¡ Á¶ÀεǴ Å×ÀÌºí¿¡ Á¸ÀçÇÏ´Â °æ¿ì
Á¶ÀÎÀ» ó¸®ÇÒ ¶§ Unique/Primary Key¸¦ 100% »ç¿ëÇÏÁö ¸øÇϰųª Non-Unique À妽º¸¦ »ç¿ë (1:n °ü°è)
´ÜÀÏ Äõ¸®ÀÎ °æ¿ì WHERE Á¶°Ç 󸮸¦ À§ÇØ Non-Unique À妽º¸¦ »ç¿ë
À妽º¸¦ »ç¿ëÇÏÁö¸¸ Á¦°øµÇ´Â °ª¿¡ ¸ÅĪµÇ´Â row°¡¸¹Áö ¾ÊÀº °æ¿ì ³ª»ÚÁö ¾ÊÀº ŸÀÔÀÓ
- ref_or_null
ref ¿Í °°Áö¸¸ IS NULL ÃÖÀûÈ°¡ ¼öÇà µÊ
- fulltext
Full Text À妽º¸¦ »ç¿ëÇÏ¿© µ¥ÀÌÅÍ Access (Only MyISAM)
- index_merge
µ¿ÀÏÇÑÅ×ÀÌºí¿¡¼ µÎ °³ ÀÌ»óÀÇ À妽º°¡ µ¿½Ã¿¡ »ç¿ëµÇ´Â °æ¿ì (fulltext À妽º Á¦¿Ü)
À妽ºº´ÇÕ ÃÖÀûÈ°¡ Àû¿ëµÇ´Â Á¶ÀΠŸÀÔ
ÀÌ°æ¿ì, key Ä÷³Àº »ç¿ëµÈ À妽ºÀÇ ¸®½ºÆ®¸¦ ³ªÅ¸³½´Ù.
- unique_subquery
IN sub-query ¿¡¼ Unique ÇÑ °á°ú°¡ ¸¸µé¾î Áö´Â °æ¿ì
index lookup functionÀÌ »ç¿ëµÊ (¼ºêÄõ¸® ÃÖÀûÈ)
- index_subquery
unique_subquery¿Í À¯»ç
IN sub-query °ªÀÌ Unique ÇÏÁö ¾ÊÀ½
- range
ÁÖ¾îÁø¹üÀ§ ³»ÀÇ row¸¦ ScanÇϸç Access ÇØ¾ß ÇÒ µ¥ÀÌÅÍÀÇ ¹üÀ§¿¡ Å©°Ô ¿µÇâÀ» ¹ÞÀ½
Å°Ä÷³ÀÌ »ó¼ö¿Í =, <>, >, >=, <, <=, IS NULL,<=>, BETWEEN ¶Ç´Â IN ¿¬»ê¿¡ »ç¿ëµÉ ¶§ Àû¿ëµÊ
- index
ÀüüÀ妽º BlockÀ» ½ºÄµ ÇÏ´Â °æ¿ì, À妽º BlockÀ» ½ºÄµ ÇÑ´Ù´Â °ÍÀ» Á¦¿ÜÇϸé Full Table Sacn(ALL)°ú°°À½
ÀϹÝÀûÀÎ °æ¿ì À妽º°¡ Å×ÀÌºíº¸´Ù »çÀÌÁî°¡ À۱⠶§¹®¿¡,ALLº¸´Ù´Â ºü¸¦ °¡´É¼ºÀÌ ³ôÀ½
MySQL Àº Äõ¸®¿¡¼ ´ÜÀÏ À妽ºÀÇ ÀϺκÐÀÎ Ä÷³À» »ç¿ëÇÒ ¶§ ÀÌ Á¶ÀΟÀÔÀ» Àû¿ëÇÔ
- ALL
†Ã¼µ¥ÀÌÅÍ BlockÀ» ½ºÄµ ÇÏ´Â °æ¿ì (Full Table Scan)
ÀÌÀüÅ×À̺í°úÀÇ Á¶ÀÎÀ» À§ÇØ Ç®½ºÄµ
(Á¶Àο¡ ¾²ÀÎ) ù¹ø ° Å×À̺íÀÌ °íÁ¤ÀÌ ¾Æ´Ï¶ó¸é ºñÈ¿À²Àû
´ëºÎºÐÀÇ°æ¿ì¿¡ ¾ÆÁÖ ´À¸° ¼º´ÉÀ» º¸ÀÓ
E.
possible_keys:
MySQL
¿ÉƼ¸¶ÀÌÀú°¡ Äõ¸®Ã³¸®¸¦ À§ÇØ °í·ÁÇÑ ÀÎÅؽº Èĺ¸
possible_keys ¿¡ ³ªÅ¸³ À妽ºµéÀÌ°á°ú¿¡ ³ªÅ¸³ Å×ÀÌºí ¼ø¼¿¡¼ ½ÇÁ¦ »ç¿ëÇÒ ¼ö ¾øÀ» ¼öµµ ÀÖÀ½
F.
key:
MySQL
¿ÉƼ¸¶ÀÌÀú°¡ ½ÇÁ¦»ç¿ëÇÑ key(index)
G.
key_len:
MySQL
ÀÌ »ç¿ëÇÑ À妽ºÀÇ ±æÀÌ, key Ä÷³ °ªÀÌ NULL À̸é ÀÌ °ªµµ NULL
key_len °ªÀ¸·Î MySQL ÀÌ ½ÇÁ¦ º¹¼ö Ä÷³ Å°Áß ¾ó¸¶³ª ¸¹Àº ºÎºÐÀ» »ç¿ëÇÒ °ÍÀÎÁö ¾Ë ¼ö ÀÖÀ½
H.
ref:
ÇàÀ» ÃßÃâÇϴµ¥ Å°¿Í ÇÔ²² »ç¿ëµÈ Ä÷³À̳ª »ó¼ö °ª
I.
rows:
Äõ¸®¸¦ ¼öÇàÇϱâ À§ÇØ °Ë»öÇØ¾ß ÇÒ RowÀÇ °³¼ö (¿ÉƼ¸¶ÀÌÀú¿¬»ê¿¡ µû¸¥ ÃßÁ¤Ä¡)
J.
Extra:
MySQL
¿ÉƼ¸¶ÀÌÀú°¡ Äõ¸®¸¦ Çؼ®ÇÑ Ãß°¡ÀûÀÎ Á¤º¸¸¦³ªÅ¸³¿
- const row not found
´ë»ó Å×À̺íÀÌ empty Å×À̺íÀΰæ¿ì
-
Distinct
Distinct Äõ¸®¸¦ ¼öÇàÇÏ´Â °æ¿ì, ÀÌ¹Ì Ã³¸®ÇÑ °ª°ú µ¿ÀÏÇÑ °ªÀ»°¡£’ Row´Â ó¸®ÇÏÁö ¾ÊÀ½
- Full scan on NULL key
Index lookup functionÀÌ »ç¿ëµÇ´Â ¡°IN (Subquery)¡± Äõ¸®¿¡¼ Outer Query¿¡¼ NULL °ªÀÌ °ø±ÞµÇ´Â °æ¿ì ¹ß»ý
Index lookup ½ÇÆзΠFull Table ScanÀÌ ¹ß»ýÇÒ ¼ö ÀÖÀ½
- Impossible HAVING
HAVING ÀýÀÌ Ç×»ó False ÀÎ °æ¿ì, SELECT ó¸®ÇÏÁö ¾ÊÀ½
- Impossible WHERE
WHERE ÀýÀÌ Ç×»ó False ÀÎ °æ¿ì, SELECT ó¸®ÇÏÁö ¾ÊÀ½
- Impossible WHERE noticedafter reading const tables
const/system ŸÀÔÀÇ Å×À̺íÀ» ÀÐÀº ÈÄ WHERE Á¶°ÇÀÌ Ç×»ó FalseÀÎ °ÍÀ» È®ÀÎ
- No tables used
FROM Àý¿¡ Å×À̺íÀÌ ¸í½ÃµÇÁö ¾ÊÀ½, ȤÀº FROM DUAL ±¸¹®À» »ç¿ë
- Not exists
LEFT JOIN ÇüÅÂÀÇ Anti Join Äõ¸®¸¦ Not Exists ÇüÅ·ΠÃÖÀûÈ ÇÏ´Â °æ¿ì
(Á¶°Ç¿¡ ¸Â´Â °á°ú¸¦ ãÀ¸¸é Ãß°¡ Join ó¸®ÇÏÁö ¾ÊÀ½)
- range checked for eachrecord (index map: N)
Á¶ÀÎ󸮽à ÀûÀýÇÑ À妽º°¡ ¾ø´Â »óȲ¿¡¼, ¼±Çà Å×ÀÌºí¿¡¼ °ø±ÞµÇ´Â °ª¿¡ µû¶ó À妽º »ç¿ëÀ» °ËÅäÇÒ ¼öÀÖ´Â °æ¿ì
°ø±ÞµÇ´Â°¢°¢ÀÇ Row¿¡ ´ëÇØ range / index merge¸¦°ËÅä
N °ªÀº ¾î¶² À妽º°¡ °ËÅäµÇ¾ú´ÂÁö Ç¥½Ã (0x11011, 19 1, 4,5¹ø À妽º°¡ °ËÅä)
- Select tables optimizedaway
Äõ¸®°¡ Aggregate(¿¹: MAX) ÇÔ¼ö¸¸ Æ÷ÇÔÇÏ°í ÀÖ´Â °æ¿ì
¿ÉƼ¸¶ÀÌÀú´ÂÀ妽º Lookup ÈÄ 1°³ÀÇ °á°ú¸¸ ¸®ÅÏ
- unique row not found
const row not found¿Í °ÅÀÇ À¯»ç
SELECT ¡¦ FROM TABLE Äõ¸®¿¡¼ ¸¸Á·ÇÏ´Â row¸¦ ãÁö¸øÇÑ °æ¿ì
- Using filesort
MySQL ÀÌ Á¤·ÄÀ» À§ÇØ Ãß°¡ÀûÀÎ °úÁ¤À» ÇÊ¿ä·Î ÇÔ(¹°¸®ÀûÀÎ Á¤·ÄÀÛ¾÷ ¼öÇà)
- Using index
½ÇÁ¦µ¥ÀÌÅÍ BlockÀ» ÀÐÁö ¾Ê°í À妽º Block ¸¸À¸·Î °á°ú¸¦»ý¼ºÇÒ ¼ö ÀÖ´Â °æ¿ì (Covering Index)
Äõ¸®¿¡¼´ÜÀÏ À妽ºµÈ Ä÷³µé¸¸À» »ç¿ëÇÏ´Â °æ¿ì
- Using index for group-by
Using index¿Í À¯»çÇϸç, µ¥ÀÌÅÍ BlockÀ» ÀÐÁö ¾Ê°í À妽º Block ¸¸À¸·Î Group-By / Distinct ó¸® (Covering Index)
Loose Index Scan ó¸®
- Using join buffer
Join 󸮽à Join Buffer°¡ »ç¿ëµÇ¾úÀ½À» ÀǹÌ
Join Buffer´Â Join 󸮸¦ À§ÇÑ À妽º°¡ ¾øÀ» ¶§ »ç¿ëµÊ
- Using sort_union(...),Using union(...), Using intersect(...)
Index Merge ¼öÇà, µÎ °³ ÀÌ»óÀÇ À妽º¸¦ µ¿½Ã¿¡ »ç¿ëÇÏ¿©Ã³¸®
- Using temporary
Äõ¸®Ã³¸®¸¦ À§ÇØ Àӽà Å×À̺íÀ» »ý¼º
group by, order by Ä÷³ÀÌ °¢°¢ Ä÷³À» »ç¿ëÇÒ ¶§ ¹ß»ý.group by 󸮿¡ À妽º¸¦ »ç¿ëÇÏÁö ¸øÇÏ´Â °æ¿ì ¹ß»ý
- Using where
WHERE ÀýÀÌ ´ÙÀ½ Á¶Àο¡ »ç¿ëµÉ ÇàÀ̳ª Ŭ¶óÀ̾ðÆ®¿¡°Ô µ¹·ÁÁú ÇàÀ» Á¦ÇÑÇÏ´Â °æ¿ì
l
extra Á¤¸®:
Äõ¸®¸¦ °¡´ÉÇÑ ÇÑ ºü¸£°Ô ÇÏ·Á¸é, Extra °ªÀÇUsing filesort ³ª Using temporary ¿¡ ÁÖÀÇÇØ¾ß ÇÔ
EXPLAIN ÀÇ Ãâ·Â ³»¿ë Áß rows Ä÷³°ªµéÀ» °öÇغ½À¸·Î½á ¾ó¸¶³ª È¿°úÀûÀÎ join À» ½ÇÇàÇÏ°í ÀÖ´ÂÁö ¾Ë ¼ö ÀÖ´Ù |