|
# À̱ÛÀº mysql document ÀÇ 7.2.1
Explain Syntax ¸¦ ´ë~Ãæ ¹ø¿ªÇÑ °ÍÀÔ´Ï´Ù.
# Æ´Æ´ÀÌ ¹ø¿ªÇϰí ÀÖÀ¸³ª ¾ðÁ¦ ¿Ï·áµÉÁö ¸ð¸¨´Ï´Ù..
EXPLAIN À» »ç¿ëÇÔÀ¸·Î½á À妽º°¡
ÀûÀýÈ÷ »ç¿ëµÇ°í ÀÖ´ÂÁö °ËÅäÇÒ ¼ö ÀÖ´Ù. À妽º°¡ À߸ø »ç¿ëµÇ°í ÀÖ´Ù¸é ANALYZE
TABLE À» »ç¿ëÇÏ¿© Å×À̺íÀ» Á¡°ËÇ϶ó. À̰ÍÀº
Å×À̺íÀÇ »óŸ¦ °»½ÅÇÏ¸ç ¿ÉÆ¼¸¶ÀÌÀúÀÇ µ¿ÀÛ¿¡ ¿µÇâÀ»
ÁØ´Ù.
¿ÉƼ¸¶ÀÌÀú°¡ SELECT ¿¡ ±â·ÏµÈ ¼ø¼´ë·Î
Á¶ÀÎÀ» ÇàÇÏ°Ô °Á¦ÇÏ·Á¸é SELECT ´ë½Å¿¡ SELECT STRAIGHT_JOIN À»
»ç¿ëÇ϶ó.
EXPLAIN Àº SELECT ¹®¿¡ »ç¿ëµÈ °¢ Å×À̺í´ç
ÇϳªÀÇ ÇàÀ» ¸®ÅÏÇÑ´Ù. ³ª¿µÈ ¼ø¼´Â MYSQL ÀÌ Äõ¸®Ã³¸®¿¡ »ç¿ëÇÏ´Â
¼ø¼´ë·Î Ãâ·ÂµÈ´Ù.
MYSQL Àº ¸ðµç Á¶ÀÎÀ» single-sweep
multi-join ¹æ½ÄÀ» »ç¿ëÇÏ¿© ÇØ°áÇÑ´Ù. À̰ÍÀº MYSQL ÀÌ Ã¹¹øÂ°
Å×ÀÌºí¿¡¼ ÇÑÇàÀ» Àаí, µÎ¹øÂ° Å×ÀÌºí¿¡¼ ¸ÅÄ¡µÇ´Â ÇàÀ» ã°í,
¼¼¹øÂ° Å×ÀÌºí¿¡¼ ¸ÅÄ¡µÇ´Â ÇàÀ» ã°í.. ±×·¯ÇÑ ¹æ½ÄÀÌ´Ù. ¸ðµç
Å×À̺íµéÀÌ Ã³¸®µÈ ÈÄ ÃßÃâµÈ Ä÷³À» Ãâ·ÂÇÏ°í ´Ù½Ã Ã³À½ Å×À̺í·Î
µ¹¾Æ°¡¼ Á¶ÀÎÀ» °è¼ÓÇÑ´Ù. ÀÌ·±½ÄÀ¸·Î ù¹øÂ° Å×ÀÌºí¿¡ ´õÀÌ»ó
³²´ÂÇàÀÌ ¾øÀ»¶§±îÁö ½ÇÇàÇÑ´Ù.
(¾î´À°ÍÀÌ Ã¹¹øÂ° Å×À̺íÀÌ µÉÁö´Â mysql
¿ÉƼ¸¶ÀÌÀú°¡ °áÁ¤ÇÒ ¹®Á¦ÀÌ´Ù. STRAIGHT_JOIN À» ¸í½ÃÇÏÁö ¾Ê¾Ò´Ù¸é
À¯Àú°¡ ÀÔ·ÂÇÑ ¼ø¼¿Í´Â °ü·ÃÀÌ ¾ø´Ù.)
MYSQL 4.1 ¹öÀü¿¡¼ EXPLAIN ÀÇ Ãâ·ÂÆ÷¸äÀÌ
UNION °ú subquery, derived table À» ´Ù·ç±â¿¡ ´õ È¿°úÀûÀ¸·Î
º¯°æµÇ¾ú´Ù. ¹«¾ùº¸´Ù Áß¿äÇÑ °ÍÀº id , select_type ÀÇ µÎ Ä÷³ÀÌ
Ãß°¡µÈ °ÍÀÌ´Ù.
EXPLAIN ÀÇ °¢ ÇàÀº ÇϳªÀÇ Å×ÀÌºí¿¡ ´ëÇÑ
Á¤º¸¸¦ º¸¿©ÁÖ¸ç ´ÙÀ½°ú °°Àº Ä÷³µé·Î ±¸¼ºµÈ´Ù.
-
id
SELECT ¹øÈ£, Äõ¸®³»ÀÇ SELECT ÀÇ
±¸ºÐ¹øÈ£ÀÌ´Ù.
-
select_type
SELECT ÀÇ Å¸ÀÔ, ´ÙÀ½°ú
°°´Ù.
-
SIMPLE
´Ü¼ø SELECT (UNION À̳ª
¼ºêÄõ¸®¸¦ »ç¿ëÇÏÁö ¾ÊÀ½)
-
PRIMARY
°¡Àå ¿Ü°ûÀÇ SELECT
-
UNION
UNION ¿¡¼ÀÇ µÎ¹øÂ° ȤÀº ³ªÁß¿¡
µû¶ó¿À´Â SELECT
-
DEPENDENT
UNION
UNION ¿¡¼ÀÇ µÎ¹øÂ° ȤÀº ³ªÁß¿¡
µû¶ó¿À´Â SELECT, ¿Ü°ûÄõ¸®¿¡ ÀÇÁ¸ÀûÀÌ´Ù.
-
UNION
RESULT
UNION ÀÇ °á°ú¹°.
-
SUBQUERY
¼ºêÄõ¸®ÀÇ Ã¹¹øÂ°
SELECT
-
DEPENDENT
SUBQUERY
¼ºêÄõ¸®ÀÇ Ã¹¹øÂ° SELECT,
¿Ü°ûÄõ¸®¿¡ ÀÇÁ¸ÀûÀÌ´Ù.
-
DERIVED
SELECT ·Î ÃßÃâµÈ Å×À̺í (FROM
Àý ³»ºÎÀÇ ¼ºêÄõ¸®)
-
table
³ªÅ¸³ °á°ú°¡ ÂüÁ¶ÇÏ´Â
Å×À̺í¸í.
-
type
Á¶ÀΟÀÔ, ¾Æ·¡¿Í
°°´Ù. ¿ì¼öÇÑ ¼ø¼´ë·Î µÚ·Î°¥¼ö·Ï ³ª»Û
Á¶ÀÎÇüÅÂÀÌ´Ù.
-
system
Å×ÀÌºí¿¡ ´Ü ÇϳªÀÇ Çุ
Á¸Àç(½Ã½ºÅÛ Å×À̺í). const join ÀÇ Æ¯¼öÇÑ
°æ¿ìÀÌ´Ù.
-
const
¸¹¾Æ¾ß ÇϳªÀÇ ¸ÅÄ¡µÇ´Â Çุ
Á¸ÀçÇÏ´Â °æ¿ì. ÇϳªÀÇ ÇàÀ̱⠶§¹®¿¡ °¢ Ä÷³°ªÀº ³ª¸ÓÁö
¿¬»ê¿¡¼ »ó¼ö·Î °£ÁֵǸç, óÀ½ Çѹø¸¸ ÀоîµéÀÌ¸é µÇ±â
¶§¹®¿¡ ¹«Áö ºü¸£´Ù.
PRIMARY KEY ³ª UNIQUE
index ¸¦ »ó¼ö¿Í ºñ±³ÇÏ´Â °æ¿ì.
¾Æ·¡ÀÇ °æ¿ì¿¡¼ tbl_name Àº const table ·Î
Á¶ÀεȴÙ.
SELECT * FROM tbl_name WHERE
primary_key=1;
SELECT * FROM tbl_name
WHERE primary_key_part1=1 AND
primary_key_part2=2;
-
-
eq_ref
Á¶ÀμöÇàÀ» À§ÇØ °¢ Å×ÀÌºí¿¡¼
Çϳª¾¿ÀÇ ÇุÀÌ ÀÐÇôÁö´Â ÇüÅÂ. const ŸÀÔÀ̿ܿ¡ °¡Àå
ÈǸ¢ÇÑ Á¶ÀΟÀÔ´Ï´Ù.
Á¶Àο¬»ê¿¡ PRIMARY KEY
³ª UNIQUE index À妽º°¡
»ç¿ëµÇ´Â °æ¿ì.
À妽ºµÈ Ä÷³ÀÌ = ¿¬»ê¿¡ »ç¿ëµÇ´Â °æ¿ì. ºñ±³µÇ´Â °ªÀº
»ó¼öÀ̰ųª ÀÌÀüÁ¶Àΰá°úÀÇ Ä÷³°ªÀϼö ÀÖ´Ù.
´ÙÀ½ ¿¹¿¡¼ MySQL Àº ref_table À» ó¸®Çϴµ¥
eq_ref Á¶ÀÎÀ» »ç¿ëÇÑ´Ù.
SELECT * FROM ref_table,other_table WHERE
ref_table.key_column=other_table.column; SELECT
* FROM ref_table,other_table WHERE
ref_table.key_column_part1=
other_table.column AND
ref_table.key_column_part2=1;
-
-
ref
ÀÌÀü Å×À̺í°úÀÇ Á¶Àο¡ »ç¿ëµÉ
¸ÅÄ¡µÇ´Â À妽ºÀÇ ¸ðµçÇàÀÌ ÀÌ Å×ÀÌºí¿¡¼ ÀÐÇôÁø´Ù.
leftmost prefix ۸¸À» »ç¿ëÇϰųª »ç¿ëµÈ ۰¡
PRIMARY KEY ³ª
UNIQUE °¡ ¾Æ´Ò¶§(Áï
۰ªÀ¸·Î ´ÜÀÏÇàÀ» ÃßÃâÇÒ¼ö ¾øÀ»¶§) »ç¿ëµÇ´Â Á¶ÀÎ.
¸¸¾à »ç¿ëµÈ ۰¡ ÀûÀº¼öÀÇ Çà°ú ¸ÅÄ¡µÉ¶§ À̰ÍÀº ÀûÀýÇÑ
Á¶ÀΠŸÀÔ´Ï´Ù.
ref ´Â À妽ºµÈ Ä÷³°ú = ¿¬»ê¿¡¼ »ç¿ëµÈ´Ù.
¾Æ·¡ ¿¹¿¡¼ MySQL Àº ref_table 󸮿¡ ref Á¶ÀΠŸÀÔÀ»
»ç¿ëÇÑ´Ù.
SELECT * FROM ref_table WHERE key_column=expr;
SELECT * FROM ref_table,other_table WHERE
ref_table.key_column=other_table.column; SELECT
* FROM ref_table,other_table WHERE
ref_table.key_column_part1=
other_table.column AND
ref_table.key_column_part2=1;
-
ref_or_null
ref ¿Í °°Áö¸¸ NULL °ªÀ»
Æ÷ÇÔÇÏ´Â Çà¿¡´ëÇÑ °Ë»öÀÌ ¼ö¹ÝµÈ´Ù.
4.1.1 ¿¡¼ »õ·Ó°Ô µµÀÔµÈ Á¶ÀΟÀÔÀÌ¸ç ¼ºêÄõ¸® 󸮿¡¼
´ë°³ »ç¿ëµÈ´Ù.
¾Æ·¡ ¿¹¿¡¼ MySQL Àº ref_table 󸮿¡ ref_or_null
Á¶ÀΟÀÔÀ» »ç¿ëÇÑ´Ù.
SELECT * FROM ref_table
WHERE key_column=expr OR key_column IS NULL;
See Section 7.2.7, ¡°How
MySQL Optimizes IS
NULL¡±.
-
index_merge
À妽º º´ÇÕ ÃÖÀûȰ¡ Àû¿ëµÇ´Â
Á¶ÀΠŸÀÔ.
ÀÌ °æ¿ì, key Ä÷³Àº »ç¿ëµÈ À妽ºÀÇ ¸®½ºÆ®¸¦ ³ªÅ¸³»¸ç
key_len Ä÷³Àº »ç¿ëµÈ À妽ºÁß °¡Àå ±ä key ¸íÀ»
³ªÅ¸³½´Ù.
For more information, see Section 7.2.6, ¡°Index Merge
Optimization¡±.
-
unique_subquery
À̰ÍÀº ¾Æ·¡¿Í °°Àº ¸î¸î IN
¼ºêÄõ¸® 󸮿¡¼ ref ŸÀÔ´ë½Å
»ç¿ëµÈ´Ù.
value IN (SELECT
primary_key FROM single_table WHERE some_expr)
unique_subquery ´Â ¼º´ÉÇâ»óÀ» À§ÇØ ¼ºêÄõ¸®¸¦
´Ü¼ø index °Ë»ö ÇÔ¼ö·Î ´ëüÇÑ´Ù.
-
index_subquery
unique_subquery ¿Í ¸¶Âù°¡Áö·Î
IN ¼ºêÄõ¸®¸¦ ´ëüÇÑ´Ù. ±×·¯³ª À̰ÍÀº ¾Æ·¡¿Í °°ÀÌ
¼ºêÄõ¸®¿¡¼ non-unique À妽º°¡ »ç¿ëµÉ¶§
µ¿ÀÛÇÑ´Ù.
value IN (SELECT
key_column FROM single_table WHERE some_expr)
-
range
À妽º¸¦ »ç¿ëÇÏ¿© ÁÖ¾îÁø ¹üÀ§
³»ÀÇ Çàµé¸¸ ÃßÃâµÈ´Ù. key Ä÷³Àº »ç¿ëµÈ À妽º¸¦
³ªÅ¸³»°í key_len ´Â »ç¿ëµÈ °¡Àå ±ä key ºÎºÐÀ»
³ªÅ¸³½´Ù.
ref Ä÷³Àº ÀÌ Å¸ÀÔÀÇ Á¶Àο¡¼ NULL ÀÌ´Ù.
range ŸÀÔÀº Ű Ä÷³ÀÌ »ó¼ö¿Í =, <>, >, >=, <, <=, IS
NULL, <=>,
BETWEEN ¶Ç´Â IN ¿¬»ê¿¡ »ç¿ëµÉ¶§
Àû¿ëµÈ´Ù.
SELECT * FROM tbl_name
WHERE key_column = 10;
SELECT * FROM tbl_name
WHERE key_column BETWEEN 10 and 20;
SELECT * FROM tbl_name
WHERE key_column IN (10,20,30);
SELECT * FROM tbl_name
WHERE key_part1= 10 AND key_part2 IN (10,20,30);
-
index
ÀÌ Å¸ÀÔÀº À妽º°¡ ½ºÄµµÈ´Ù´Â°É
Á¦¿ÜÇϸé ALL °ú °°´Ù. ÀϹÝÀûÀ¸·Î À妽º ÆÄÀÏÀÌ
µ¥ÀÌŸÆÄÀϺ¸´Ù À۱⠶§¹®¿¡ ALL º¸´Ù´Â ºü¸£´Ù.
MySQL Àº Äõ¸®¿¡¼ ´ÜÀÏ À妽ºÀÇ ÀϺκÐÀÎ Ä÷³À»
»ç¿ëÇÒ¶§ ÀÌ Á¶ÀΟÀÔÀ» Àû¿ëÇÑ´Ù.
-
ALL
ÀÌÀü Å×À̺í°úÀÇ Á¶ÀÎÀ» À§ÇØ
Ç®½ºÄµÀÌ µÈ´Ù. ¸¸¾à (Á¶Àο¡ ¾²ÀÎ) ù¹øÂ° Å×À̺íÀÌ
°íÁ¤ÀÌ ¾Æ´Ï¶ó¸é ºñÈ¿À²ÀûÀÌ´Ù, ±×¸®°í ´ëºÎºÐÀÇ °æ¿ì¿¡
¾ÆÁÖ ´À¸° ¼º´ÉÀ» º¸ÀδÙ. º¸Åë »ó¼ö°ªÀ̳ª »ó¼öÀÎ
Ä÷³°ªÀ¸·Î row¸¦ ÃßÃâÇϵµ·Ï À妽º¸¦ Ãß°¡ÇÔÀ¸·Î½á ALL
ŸÀÔÀ» ÇÇÇÒ ¼ö ÀÖ´Ù.
-
possible_keys
ÀÌ Ä÷³°ªÀº MySQL ÀÌ ÇØ´ç Å×À̺íÀÇ
°Ë»ö¿¡ »ç¿ëÇÒ¼ö ÀÖ´Â À妽ºµéÀ» ³ªÅ¸³½´Ù.
ÁÖÀÇÇÒ°ÍÀº explain °á°ú¿¡¼ ³ªÅ¸³ Å×À̺íµéÀÇ ¼ø¼¿Í´Â
¹«°üÇÏ´Ù´Â °ÍÀÌ´Ù.
À̰ÍÀº possible_keys ¿¡ ³ªÅ¸³ À妽ºµéÀÌ °á°ú¿¡ ³ªÅ¸³ Å×À̺í
¼ø¼¿¡¼ ½ÇÁ¦ »ç¿ëÇÒ ¼ö ¾øÀ»¼öµµ ÀÖ´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù.
À̰ªÀÌ NULL À̶ó¸é »ç¿ë°¡´ÉÇÑ À妽º°¡ ¾ø´Ù´Â °ÍÀÌ´Ù. ÀÌ·¯ÇÑ
°æ¿ì¿¡´Â À妽º¸¦ where ÀýÀ» °í·ÁÇÏ¿© »ç¿ëµÊÁ÷ÇÑ ÀûÀýÇÑ Ä÷³¿¡
À妽º¸¦ Ãß°¡ÇÔÀ¸·Î½á ¼º´ÉÀ» °³¼±ÇÒ ¼ö ÀÖ´Ù. À妽º¸¦
¼öÁ¤ÇÏ¿´´Ù¸é ´Ù½ÃÇѹø EXPLAIN À» ½ÇÇàÇÏ¿©
üũÇ϶ó. See Section 13.2.2, ¡°ALTER
TABLE Syntax¡±.
ÇöÀç Å×À̺íÀÇ À妽º¸¦ º¸±â À§Çؼ´Â
SHOW INDEX FROM tbl_name.À»
»ç¿ëÇ϶ó.
-
key
ÀÌ Ä÷³Àº MySQL ÀÌ ½ÇÁ¦ »ç¿ëÇÑ
key(index) ¸¦ ³ªÅ¸³½´Ù.
¸¸¾à »ç¿ëÇÑ À妽º°¡ ¾ø´Ù¸é NULL °ªÀÏ °ÍÀÌ´Ù. MySQL ÀÌ
possible_keys ¿¡ ³ªÅ¸³ À妽º¸¦ »ç¿ëÇϰųª »ç¿ëÇÏÁö ¾Êµµ·Ï
°Á¦ÇÏ·Á¸é FORCE INDEX,
USE INDEX, ȤÀº IGNORE INDEX ¸¦ ÇÔ²² »ç¿ëÇ϶ó.
See Section 13.1.7,
¡°SELECT
Syntax¡±.
MyISAM
°ú BDB Å×ÀÌºí¿¡¼´Â ANALYZE TABLE ÀÌ ¿ÉƼ¸¶ÀÌÀú°¡ ´õ³ªÀº
À妽º¸¦ ¼±ÅÃÇÒ ¼ö ÀÖµµ·Ï Å×À̺íÀÇ Á¤º¸¸¦ °»½ÅÇÑ´Ù.
MyISAM ¿¡¼´Â myisamchk --analyze °¡ °°Àº
±â´ÉÀ» ÇÑ´Ù.
See Section 13.5.2.1, ¡°ANALYZE
TABLE Syntax¡± and Section 5.7.2, ¡°Table Maintenance and Crash
Recovery¡±.
-
key_len
ÀÌ Ä÷³Àº MySQL ÀÌ »ç¿ëÇÑ À妽ºÀÇ
±æÀ̸¦ ³ªÅ¸³½´Ù. key Ä÷³°ªÀÌ NULL À̸é À̰ªµµ NULL ÀÌ´Ù.
key_len °ªÀ¸·Î MySQL ÀÌ ½ÇÁ¦ º¹¼öÄ÷³ ŰÁß ¾ó¸¶³ª ¸¹Àº ºÎºÐÀ»
»ç¿ëÇÒ °ÍÀÎÁö ¾Ë ¼ö ÀÖ´Ù.
-
ref
ÀÌ Ä÷³Àº ÇàÀ» ÃßÃâÇϴµ¥ Ű¿Í ÇÔ²²
»ç¿ëµÈ Ä÷³À̳ª »ó¼ö°ªÀ» ³ªÅ¸³½´Ù.
-
rows
ÀÌ °ªÀº Äõ¸® ¼öÇà¿¡¼ MySQL ÀÌ ¿¹»óÇÏ´Â
°Ë»öÇØ¾ßÇÒ Çà¼ö¸¦ ³ªÅ¸³½´Ù.
-
Extra
ÀÌ Ä÷³Àº MySQL ÀÌ Äõ¸®¸¦ ÇØ¼®ÇÑ
Ãß°¡ÀûÀÎ Á¤º¸¸¦ ³ªÅ¸³½´Ù.
¾Æ·¡¿Í °°Àº °ªµéÀÌ ³ªÅ¸³¯ ¼ö ÀÖ´Ù.
-
Distinct
MySQL ÀÌ ¸ÅÄ¡µÇ´Â ùÇàÀ» ã´Â
Áï½Ã °Ë»öÀ» Áß´ÜÇÒ °ÍÀÌ´Ù.
-
Not
exists
MySQL ÀÌ LEFT JOIN À» ¼öÇàÇÔ¿¡
¸ÅÄ¡µÇ´Â ÇÑ ÇàÀ» ãÀ¸¸é ´õÀÌ»ó ¸ÅÄ¡µÇ´Â ÇàÀ» °Ë»öÇÏÁö
¾Ê´Â´Ù.
¾Æ·¡¿Í °°Àº °æ¿ì¿¡ ÇØ´çÇÑ´Ù.
SELECT * FROM t1 LEFT JOIN t2 ON t1.id=t2.id
WHERE t2.id IS NULL;
¿©±â¼ t2.id ´Â NOT NULL À̰í, À̰æ¿ì MySQL Àº t1 À»
½ºÄµÇÑ ÈÄ t1.id °ªÀ» »ç¿ëÇØ t2 ¸¦ °Ë»öÇÑ´Ù. MySQL ÀÌ t2
¿¡¼ ¸ÅÄ¡µÇ´Â ÇàÀ» ãÀ¸¸é t2.id ´Â NULL ÀÌ µÉ ¼ö ¾øÀ¸¹Ç·Î
´õÀÌ»ó ÁøÇàÇÏÁö ¾Ê´Â´Ù. Áï, t1 ÀÇ °¢ Çà¿¡ ´ëÇØ t2 ¿¡¼
¸ÅÄ¡µÇ´Â ÇàÀÌ ¸î°³°¡ ÀÖ´øÁö ÇѰ³¸¸ ãÀ¸¸é µÈ´Ù.
-
range
checked for each record (index map: #)
MySQL ÀÌ »ç¿ëÇÒ ÁÁÀº À妽º°¡
¾ø´Ù. ±×·¯³ª ¼±ÇàµÈ Å×À̺íÀÇ Ä÷³°ª¿¡ µû¶ó ¸î¸î À妽º¸¦
»ç¿ëÇÒ ¼ö ÀÖ´Ù. ¼±ÇàµÈ Å×À̺íÀÇ °³°³ Çà¿¡ ´ëÇØ MySQL ÀÌ
range ³ª index_merge Á¢±Ù¹ýÀ» »ç¿ëÇÒ ¼ö ÀÖ´ÂÁö üũÇÒ
°ÍÀÌ´Ù.
Àû¿ë°¡´É¼ºÀÇ ÇÙ½ÉÀº Section 7.2.5, ¡°Range
Optimization¡± and
Section 7.2.6, ¡°Index
Merge Optimization¡± ¿¡ ¸ðµç ¼±ÇàµÈ Å×À̺íÀÇ
°ªÀÌ ¸íÈ®Çϰųª »ó¼öÀÎ ¶§¸¦ ¿¹¿Ü·Î ÇÏ¿© ±â¼úµÇ¾î
ÀÖ´Ù.
À̰ÍÀº ±×¸® ºü¸£Áø ¾ÊÀ¸³ª À妽º°¡ ¾ø´Â Á¶ÀÎÀÇ °æ¿ìº¸´Ù´Â
ºü¸£´Ù.
-
Using
filesort
MySQL ÀÌ Á¤·ÄÀ» À§ÇØ Ãß°¡ÀûÀÎ
°úÁ¤À» ÇÊ¿ä·ÎÇÑ´Ù. Á¤·Ä°úÁ¤Àº Á¶ÀΟÀÔ¿¡ µû¶ó ¸ðµç ÇàÀ»
°Ë»öÇϰí WHERE Àý¿¡ ÀÇÇØ ¸ÅÄ¡µÈ ¸ðµç ÇàµéÀÇ Å°°ªÀ»
ÀúÀåÇÑ´Ù. ±×¸®°í ÀúÀåµÈ ۰ªÀ» Á¤·ÄÇÏ¿© ÀçÁ¤·ÄµÈ ¼ø¼·Î
ÇàµéÀ» ÃßÃâÇÑ´Ù.
See Section 7.2.10, ¡°How MySQL
Optimizes ORDER
BY¡±.
-
Using
where
WHERE ÀýÀÌ
´ÙÀ½ Á¶Àο¡ »ç¿ëµÉ ÇàÀ̳ª Ŭ¶óÀÌ¾ðÆ®¿¡°Ô µ¹·ÁÁú ÇàÀ»
Á¦ÇÑÇÏ´Â °æ¿ìÀÌ´Ù. Å×À̺íÀÇ ¸ðµç ÇàÀ» °Ë»çÇÒ Àǵµ°¡
¾Æ´Ï¶ó¸é Extra °ªÀÌ Using where °¡ ¾Æ´Ï°í Á¶ÀΟÀÔÀÌ ALL
À̳ª index ¶ó¸é Äõ¸®»ç¿ëÀÌ À߸øµÇ¾ú´Ù.
-
Äõ¸®¸¦
°¡´ÉÇÑ ÇÑ ºü¸£°Ô ÇÏ·Á¸é, Extra °ªÀÇ Using filesort ³ª Using
temporary ¿¡ ÁÖÀÇÇØ¾ß ÇÑ´Ù.
-
Using
sort_union(...) , Using union(...) , Using
intersect(...)
À̵éÀº À妽º º´ÇÕ Á¶ÀΟÀÔ¿¡¼ À妽º ½ºÄµÀÌ º´ÇյǴÂ
ÇüŸ¦ ¸»ÇÑ´Ù.
See Section 7.2.6, ¡°Index Merge
Optimization¡± for more
information.
-
Using index
for group-by
Å×À̺í Á¢±Ù¹æ½ÄÀº Using index ¿Í
°°´Ù. MySQL ÀÌ ½ÇÁ¦ Å×ÀÌºí¿¡ ´ëÇÑ ¾î¶°ÇÑ Ãß°¡ÀûÀÎ µð½ºÅ©
Á¢±Ù ¾øÀÌ GROUP BY ³ª DICTINCT Äõ¸®¿¡ »ç¿ëµÈ ¸ðµç Ä÷³¿¡
´ëÇÑ À妽º¸¦ ã¾ÒÀ½À» ¸»ÇÑ´Ù. Ãß°¡ÀûÀ¸·Î °¢°¢ÀÇ group ¿¡
´ÜÁö ¸î°³ÀÇ À妽º Ç׸ñ¸¸ÀÌ ÀÐÇôÁöµµ·Ï °¡Àå È¿À²ÀûÀÎ
¹æ½ÄÀ¸·Î À妽º°¡ »ç¿ëµÉ °ÍÀÌ´Ù.
For details, see Section 7.2.11, ¡°How MySQL
Optimizes GROUP
BY¡±.
EXPLAIN ÀÇ Ãâ·Â³»¿ëÁß rows Ä÷³°ªµéÀ»
°öÇØº½À¸·Î½á ¾ó¸¶³ª È¿°úÀûÀÎ join À» ½ÇÇàÇϰí ÀÖ´ÂÁö ¾Ë ¼ö ÀÖ´Ù. ÀÌ
°ªÀº MySQL ÀÌ Äõ¸®¼öÇàÁß °Ë»çÇØ¾ßÇÒ Çà¼ö¸¦ ´ë·«ÀûÀ¸·Î ¾Ë·ÁÁØ´Ù.
¸¸¾à max_join_size ½Ã½ºÅÛ º¯¼ö°ªÀ» ¼³Á¤ÇÏ¿´´Ù¸é ÀÌ °ªÀº ¶ÇÇÑ
¿©·¯Å×À̺íÀ» »ç¿ëÇÏ´Â select Áß ¾î´À°ÍÀ» ¸ÕÀú ½ÇÇàÇÒÁö ÆÇ´ÜÇϴµ¥
»ç¿ëµÈ´Ù.
See Section 7.5.2, ¡°Tuning Server
Parameters¡±.
´ÙÀ½ ¿¹´Â ´ÙÁßÅ×À̺í Á¶ÀÎÀÌ EXPLAIN Á¤º¸¸¦
ÅëÇØ Á¡Â÷ÀûÀ¸·Î °³¼±µÇ´Â °úÁ¤À» º¸¿©ÁØ´Ù. ¸¸¾à ¾Æ·¡¿Í °°Àº select
¹®À» EXPLAIN À¸·Î °³¼±ÇÑ´Ù¸é :
EXPLAIN SELECT tt.TicketNumber, tt.TimeIn,
tt.ProjectReference, tt.EstimatedShipDate,
tt.ActualShipDate, tt.ClientID,
tt.ServiceCodes, tt.RepetitiveID,
tt.CurrentProcess, tt.CurrentDPPerson,
tt.RecordVolume, tt.DPPrinted, et.COUNTRY,
et_1.COUNTRY, do.CUSTNAME
FROM tt, et, et AS et_1, do
WHERE tt.SubmitTime IS NULL
AND tt.ActualPC = et.EMPLOYID
AND tt.AssignedPC = et_1.EMPLOYID
AND tt.ClientID = do.CUSTNMBR;
ÀÌ ¿¹¿¡¼ ¾Æ·¡¿Í °°Àº °¡Á¤ÀÌ
»ç¿ëµÇ¾ú´Ù.:
-
The columns being compared have been
declared as follows:
-
The tables have the following
indexes:
-
The tt.ActualPC values are not evenly
distributed.
¸ÕÀú, °³¼±µÇ±â ÀüÀÇ EXPLAIN Àº ´ÙÀ½°ú °°Àº
Á¤º¸¸¦ º¸¿©ÁØ´Ù.:
table type possible_keys key key_len ref rows Extra
et ALL PRIMARY NULL NULL NULL 74
do ALL PRIMARY NULL NULL NULL 2135
et_1 ALL PRIMARY NULL NULL NULL 74
tt ALL AssignedPC, NULL NULL NULL 3872
ClientID,
ActualPC
range checked for each record (key map: 35)
°¢ Å×À̺íÀÇ type ÀÌ ALL À» ³ªÅ¸³»¹Ç·Î, MySQL ÀÌ ¸ðµç Å×À̺íÀÇ
īƼ¼Ç°ö(Cartesian product) ¸¦ »ý¼ºÇÑ´Ù´Â °ÍÀ» ³ªÅ¸³½´Ù.
°¢ Å×À̺íÀÇ ÇàÀÇ Á¶ÇÕÀÌ ¸ðµÎ °Ë»çµÇ¾î¾ß Çϱ⠶§¹®¿¡ À̰ÍÀº ¾ÆÁÖ
¿À·£ ½Ã°£ÀÌ ¼Ò¿äµÉ °ÍÀÌ´Ù.
½ÇÁ¦·Î ÀÌ °á°ú´Â 74 * 2135 * 74 * 3872 = 45,268,558,720 Çà¿¡
´ÞÇÑ´Ù.
¸¸¾à Å×À̺íÀÌ ´õ Å©´Ù¸é ¾ó¸¶³ª ¼Ò¿äµÉÁö »ó»óÇÒ ¼öµµ ¾øÀ»
°ÍÀÌ´Ù.
¿©±â¼ ¿ì¼±ÀûÀÎ ¹®Á¦´Â MySQL Àº °°Àº ŸÀÔÀ¸·Î ¼±¾ðµÈ Ä÷³ÀÇ
À妽º¸¦ ´õ È¿°úÀûÀ¸·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù. (ISAM Å×ÀÌºí¿¡¼´Â
°°Àº ŸÀÔÀ¸·Î ¼±¾ðµÇÁö ¾ÊÀº À妽º´Â »ç¿ëÇÒ ¼ö ¾ø´Ù.) ¿©±â¿¡¼
VARCHAR °ú CHAR Àº ±æÀ̰¡ ´Ù¸£Áö ¾Ê´Ù¸é °°Àº ŸÀÔÀÌ´Ù.
tt.ActualPC ´Â CHAR(10) À̰í et.EMPLOYID ´Â CHAR(15) ·Î ¼±¾ðµÇ¾î
ÀÖÀ¸¹Ç·Î ±æÀÌÀÇ ºÒÀÏÄ¡°¡ ¹ß»ýÇÑ´Ù.
ÀÌ·¯ÇÑ Ä÷³ ±æÀÌÀÇ ºÒÀÏÄ¡ ¹®Á¦ÀÇ ÇØ°áÀ»
À§ÇØ ALTER TABLE À» »ç¿ëÇÏ¿© ActualPC Ä÷³À» 10 ±ÛÀÚ¿¡¼ 15 ±ÛÀÚ·Î
º¯°æÇÏÀÚ (±æÀ̸¦ ´Ã¸®´Â°ÍÀº µ¥ÀÌŸ ¼Õ½ÇÀÌ ¾ø´Ù.)
mysql> ALTER TABLE tt MODIFY
ActualPC VARCHAR(15);
ÀÌÁ¦ tt.ActualPC ¿Í et.EMPLYID ´Â ¸ðµÎ VARCHAR(15) ÀÌ´Ù. ´Ù½Ã
EXPLAIN À» ½ÇÇàÇØº¸¸é ´ÙÀ½ °á°ú¿Í °°´Ù.
table type possible_keys key key_len ref rows Extra
tt ALL AssignedPC, NULL NULL NULL 3872 Using
ClientID, where
ActualPC
do ALL PRIMARY NULL NULL NULL 2135
range checked for each record (key map: 1)
et_1 ALL PRIMARY NULL NULL NULL 74
range checked for each record (key map: 1)
et eq_ref PRIMARY PRIMARY 15 tt.ActualPC 1
ÈξÀ ÁÁ¾ÆÁ³Áö¸¸ ¾ÆÁ÷ ¿Ïº®ÇÏÁö ¾Ê´Ù. ÇàÀÇ
°öÀº ÀÌÁ¦ 74 ¸¸Å ÁÙ¾ú´Ù.
ÀÌ Äõ¸®´Â ÀÌÁ¦ ¸îÃʸ¸¿¡ ½ÇÇàµÉ
°ÍÀÌ´Ù.
µÎ¹øÂ° ÀÛ¾÷Àº tt.AssignedPC = et_1.EMPLYID
¿Í tt.ClientID = do.CUSTNMBR ¿¡¼ÀÇ Ä÷³±æÀÌÀÇ ºÒÀÏÄ¡¸¦ ¼öÁ¤ÇÏ´Â
°ÍÀÌ´Ù.
mysql> ALTER TABLE tt MODIFY AssignedPC VARCHAR(15),
-> MODIFY ClientID VARCHAR(15);
ÀÌÁ¦ EXPLAIN Àº ´ÙÀ½°ú °°Àº °á°ú¸¦
º¸¿©ÁØ´Ù.
table type possible_keys key key_len ref rows Extra
et ALL PRIMARY NULL NULL NULL 74
tt ref AssignedPC, ActualPC 15 et.EMPLOYID 52 Using
ClientID, where
ActualPC
et_1 eq_ref PRIMARY PRIMARY 15 tt.AssignedPC 1
do eq_ref PRIMARY PRIMARY 15 tt.ClientID 1
À̰ÍÀº ÀÌÁ¦ °ÅÀÇ ÃÖÀûÀÇ °á°ú°¡ µÈ °Í
°°´Ù.
³²¾ÆÀÖ´Â ¹®Á¦´Â MySQL ÀÌ ±âº»À¸·Î
tt.ActualPC Ä÷³ÀÇ °ªÀÌ ±ÕµîÇÏ°Ô ºÐÆ÷µÇ¾î ÀÖ´Ù°í °¡Á¤ÇÑ´Ù´Â °ÍÀÌ´Ù.
ÇÏÁö¸¸ tt Å×À̺íÀº ½ÇÁ¦·Î ±×·¸Áö ¾Ê´Ù.
´ÙÇàÈ÷µµ MySQL ÀÌ Å° ºÐÆ÷¸¦ °Ë»çÇϵµ·Ï
Çϴ°ÍÀº ¸Å¿ì ½±´Ù.
mysql> ANALYZE TABLE tt;
ÀÌÁ¦ ¿Ïº®ÇÑ Á¶ÀÎÀÌ µÇ¾ú´Ù. EXPLAIN °á°ú´Â
´ÙÀ½°ú °°´Ù.
table type possible_keys key key_len ref rows Extra
tt ALL AssignedPC NULL NULL NULL 3872 Using
ClientID, where
ActualPC
et eq_ref PRIMARY PRIMARY 15 tt.ActualPC 1
et_1 eq_ref PRIMARY PRIMARY 15 tt.AssignedPC 1
do eq_ref PRIMARY PRIMARY 15 tt.ClientID 1
EXPLAIN °á°úÀÇ rows Ä÷³°ªÀÌ ³ªÅ¸³»´Â MySQL
ÃÖÀûÈ¿¡ ÀÇÇØ ¿¹ÃøµÈ Çà¼ö¿¡ ÁÖ¸ñÇ϶ó.
³ªÅ¸³ ¼ýÀÚ°¡ ½ÇÁ¦ Çà¼ö¿¡ ±ÙÁ¢ÇÑÁö Ã¼Å©ÇØ¾ß
ÇÑ´Ù. ±×·¸Áö ¾Ê´Ù¸é STRAIGHT_JOIN ¸¦ »ç¿ë°í FROM Àý¿¡¼ Å×À̺íÀÇ
¼ø¼¸¦ º¯°æÇÔÀ¸·Î½á ´õ ³ªÀº ¼º´ÉÀ» ¾òÀ» ¼ö ÀÖ´Ù.
|