MySQL 5.5 ÆÄƼ¼Ç ±â´É °³¼±»çÇ× ÀÚ¼¼È÷ ¾Ë¾Æº¸±â
°³¿ä
MySQL 5.5 ¸±¸®Áî´Â ¸î °¡Áö ±â´ÉÇâ»óÀÌ µÇ¾ú½À´Ï´Ù. ´ç¿¬È÷, ´ëºÎºÐÀÇ ³»¿ëÀº semi-synchronous replication°¡ ÁÖ¸ñµÇ´Â µ¿¾È ÆÄƼ¼ÇÀÇ Çâ»óµÈ ±â´ÉÀº µµ¿Ü½ÃµÇ°í, ¶§·Î´Â ÀÌ ±â´ÉÀÇ ÁøÁ¤ÇÑ Àǹ̿¡ ´ëÇÑ ¾à°£ÀÇ ¿ÀÇØµµ ¹ß»ýÇß½À´Ï´Ù. ÀÌ ¹®¼¸¦ ÅëÇØ¼, ¸ÚÁø ±â´É°ú ƯÈ÷ Àß ÀÌÇØ°¡ µÇÁö ¾Ê´Â ºÎºÐÀ» ¼³¸íÇÏ·Á ÇÕ´Ï´Ù.
Á÷°üÀûÀÎ ºÎºÐ: ºñÁ¤¼ö(non-integer) Ä÷³ÀÇ ÆÄƼ¼Ç
Áö±Ý±îÁö Á¤¼öÇüÀÌ ¾Æ´Ñ Ä÷³À» »ç¿ëÇÏ¿© ÆÄƼ¼ÇÀ» »ç¿ëÇØº» °æÇèÀÌ ÀÖ´Ù¸é(MySQL 5.1 ÆÄƼ¼Ç ¿¬½À ÂüÁ¶) ¸¹Àº ¹®Á¦·Î ÀÏÁ¾ÀÇ ÁÂÀýÀ» °æÇèÇßÀ» °ÍÀÔ´Ï´Ù.
»õ·Î¿î Ãß°¡»çÇ×Àº ¹üÀ§(RANGE)¿Í ¸®½ºÆ® ÆÄƼ¼Ç°ú ÇÔ²¾ ÀÛµ¿ÇÕ´Ï´Ù. »õ·Î¿î ±â´ÉÀ» ¼Ò°³ÇÏ´Â »õ·Î¿î Ä÷³ Ű¿öµå°¡ ÀÖ½À´Ï´Ù.
´ÙÀ½°ú °°Àº Å×À̺íÀÌ ÀÖ´Ù°í °¡Á¤ÇÕ´Ï´Ù.
CREATE TABLE expenses (
expense_date DATE NOT NULL,
category VARCHAR(30),
amount DECIMAL (10,3)
);
¸¸¾à¿¡ MySQL 5.1¿¡¼ category Ä÷³À¸·Î ÆÄƼ¼ÇÀ» ¿øÇÑ´Ù¸é, category Ä÷³À» Á¤¼öÇüÀ¸·Î º¯È¯Çϰí category¿¡ ´ëÇÑ ³»¿ëÀ» ã¾Æº¼ ¼ö ÀÖ´Â Å×À̺íÀ» Ãß°¡Çؾ߸¸ ÇÕ´Ï´Ù. MySQL 5.5¿¡¼´Â °£´ÜÇÏ°Ô Ã³¸®ÇÒ ¼ö ÀÖ½À´Ï´Ù.
ALTER TABLE expenses
PARTITION BY LIST COLUMNS (category)
(
PARTITION p01 VALUES IN ( 'lodging', 'food'),
PARTITION p02 VALUES IN ( 'flights', 'ground transportation'),
PARTITION p03 VALUES IN ( 'leisure', 'customer entertainment'),
PARTITION p04 VALUES IN ( 'communications'),
PARTITION p05 VALUES IN ( 'fees')
);
ÀÌ ±¸¹®Àº ¸íÈ®ÇÏ°Ô ÀÐÀ» ¼ö ÀÖ°í È¿À²ÀûÀÎ °áÁýÀ¸·Î µ¥ÀÌÅ͸¦ Á¤¸®ÇÏ´Â°Í »Ó¸¸¾Æ´Ï¶ó ¿ÀÁ÷ ¿°ÅµÈ category¸¸ »ç¿ëÀÌ °¡´ÉÇÏ¿©, ´Ù¸¥Ãø¸é¿¡¼ÀÇ ÇýÅÃÀÌ ÀÖ½À´Ï´Ù.
MySQL 5.1¿¡¼ÀÇ ¶Ç ´Ù¸¥ ¹®Á¦Á¡Àº ³¯ÀÚ¿ÀÇ Ã³¸®ÀÔ´Ï´Ù. ¾Æ·¡¿Í °°Àº »óȲ¿¡¼ YEAR ¶Ç´Â TO_DAYS Áß Çϳª¸¦ »ç¿ëÇÏ´Â Ä÷³¿¡ ´ëÇØ¼ Á÷Á¢ »ç¿ëÇÒ ¼ö ¾øÁö¸¸, º¯È¯ÀÌ ÇÊ¿äÇÕ´Ï´Ù.
/* with MySQL 5.1*/
CREATE TABLE t2
(
dt DATE
)
PARTITION BY RANGE (TO_DAYS(dt))
(
PARTITION p01 VALUES LESS THAN (TO_DAYS('2007-01-01')),
PARTITION p02 VALUES LESS THAN (TO_DAYS('2008-01-01')),
PARTITION p03 VALUES LESS THAN (TO_DAYS('2009-01-01')),
PARTITION p04 VALUES LESS THAN (MAXVALUE));
SHOW CREATE TABLE t2 \G
*************************** 1. row ***************************
Table: t2
Create Table: CREATE TABLE `t2` (
`dt` date DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
/*!50100 PARTITION BY RANGE (TO_DAYS(dt))
(PARTITION p01 VALUES LESS THAN (733042) ENGINE = MyISAM,
PARTITION p02 VALUES LESS THAN (733407) ENGINE = MyISAM,
PARTITION p03 VALUES LESS THAN (733773) ENGINE = MyISAM,
PARTITION p04 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) */
ÀÌ ¾ó¸¶³ª ¹«¼·°í ÁøÁ¤ÇÑ °íÅëÀ» ÁÖ´Â ÄÚµåÀԴϱî? ¹°·Ð, ÇØ°á ¹æ¹ýÀº ÀÖÁö¸¸, ¸¹Àº ¹®Á¦°¡ ¹ß»ýÇß½À´Ï´Ù. YEAR ¶Ç´Â TO_DAYS¸¦ »ç¿ëÇÏ¿© ÆÄƼ¼ÇÀ» Á¤ÀÇÇÏ´Â °Í°ú, ÇÔ¼ö·Î ÆÄ´Ï¼Å´×µÈ ºÎºÐ¿¡ ÁúÀÇ ¹®À¸·Î ³ëÃâµÈ Ä÷³À» ±âÁØÀ¸·Î ÁúÀǸ¦ ÇÏ´Â °ÍÀº Á¤¸» ¸»µµ ¾È µÇ´Â ÆÛÁñÀ» ¸¶Ãß´Â °Í °°½À´Ï´Ù.
ÀÌÁ¨ »óȲÀÌ ´Þ¶óÁ³½À´Ï´Ù. ³¯Â¥º°·Î ºÐÇÒÇÏ´Â °ÍÀÌ ½¬°í Á÷°üÀûÀ¸·Î µÇ¾ú½À´Ï´Ù.
/*With MySQL 5.5*/
CREATE TABLE t2
(
dt DATE
)
PARTITION BY RANGE COLUMNS (dt)
(
PARTITION p01 VALUES LESS THAN ('2007-01-01'),
PARTITION p02 VALUES LESS THAN ('2008-01-01'),
PARTITION p03 VALUES LESS THAN ('2009-01-01'),
PARTITION p04 VALUES LESS THAN (MAXVALUE));
SHOW CREATE TABLE t2 \G
*************************** 1. row ***************************
Table: t2
Create Table: CREATE TABLE `t2` (
`dt` date DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
/*!50500 PARTITION BY RANGE COLUMNS(dt)
(PARTITION p01 VALUES LESS THAN ('2007-01-01') ENGINE = MyISAM,
PARTITION p02 VALUES LESS THAN ('2008-01-01') ENGINE = MyISAM,
PARTITION p03 VALUES LESS THAN ('2009-01-01') ENGINE = MyISAM,
PARTITION p04 VALUES LESS THAN (MAXVALUE) ENGINE = MyISAM) */
ÀÌÀü °æ¿ì¿Í °°Àº ÆÄƼ¼Ç Á¤¸®´Â ¹ö¸± ¼ö ÀÖ½À´Ï´Ù. Á¤ÀÇµÈ Ä÷³À» ±âÁØÀ¸·Î Çϱ⠶§¹®¿¡, Ä÷³À» ±âÁØÀ¸·Î ÇÔ¼ö¿Í Äõ¸®ÀÇ ÀÇÇÑ Á¤ÀÇ »çÀÌ¿¡¼ È¥¶õÀÌ ¾ø½À´Ï´Ù. DBAÀÇ ¾÷¹«¸¦ ¼ö¿ùÇÏ°Ô Çϱâ À§Çؼ, Á¤ÀǵǾîÁø °ªÀ» ±×´ë·Î À¯ÁöÇÕ´Ï´Ù.
¸ðµÎ°¡ Çàº¹ÇØÁ³ÁÒ? ¾Æ¸¶, ´ëºÎºÐ ±×·²°Í ÀÔ´Ï´Ù. ÀÌÁ¦ Ä÷³ Ư¼º¿¡ ´ëÇÑ Á¶±Ý ´õ ¸ðÈ£ÇÑ Æ¯¼º¿¡ ´ëÇÏ¿© »ìÆìº¸°Ú½À´Ï´Ù.
Á÷°ü¿¡ ¹Ý´ëµÇ´Â ºÎºÐ: ´ÙÁß Ä÷³(multiple columns)
Ä÷³ Ű¿öµå´Â ¹®ÀÚ¿À̳ª date Ä÷³ÀÇ ÆÄƼ¼Ç Á¤ÀÇÀÚ¸¦ Çã¶ôÇÏ´Â °Íº¸´Ù ´õ ÁÁ½À´Ï´Ù. ±×°ÍÀº ¶ÇÇÑ ÆÄƼ¼ÇÀ» Á¤ÀÇÇÏ´Â ´ÙÁß Ä÷³À¸·Î »ç¿ëÀÌ °¡´ÉÇÕ´Ï´Ù.
°ø½ÄÀûÀÎ ¹®¼¿¡¼ ¾Æ·¡ÀÇ ¿¹¹®°ú ºñ½ÁÇÑ ¸î °¡Áö ¿¹Á¦¸¦ º»ÀûÀÌ ÀÖÀ» °ÍÀÔ´Ï´Ù.
CREATE TABLE p1 (
a INT,
b INT,
c INT
)
PARTITION BY RANGE COLUMNS (a,b)
(
PARTITION p01 VALUES LESS THAN (10,20),
PARTITION p02 VALUES LESS THAN (20,30),
PARTITION p03 VALUES LESS THAN (30,40),
PARTITION p04 VALUES LESS THAN (40,MAXVALUE),
PARTITION p05 VALUES LESS THAN (MAXVALUE,MAXVALUE)
);
CREATE TABLE p2 (
a INT,
b INT,
c INT
)
PARTITION BY RANGE COLUMNS (a,b)
(
PARTITION p01 VALUES LESS THAN (10,10),
PARTITION p02 VALUES LESS THAN (10,20),
PARTITION p03 VALUES LESS THAN (10,30),
PARTITION p04 VALUES LESS THAN (10,MAXVALUE),
PARTITION p05 VALUES LESS THAN (MAXVALUE,MAXVALUE)
)
PARTITION BY RANGE COLUMNS (a,b,c) À» ±âÁØÀ¸·Î ÇÏ´Â ¿¹Á¦µµ ÀÖ½À´Ï´Ù. ¸¸¾à¿¡ ÀÌ·¯ÇÑ ¿¹¹®À¸·Î ºÎÅÍ ´ë´ÜÇÑ ¾ÆÀ̵ð¾î¸¦ ¾òÀº µ¶ÀÚ¶ó¸é, ºÎ´ã ¾øÀÌ ³ª¸¦ Àç¹ÌÀÖ°Ô ¸¸µé¾î ÁÖ¼¼¿ä. ¿Ö³ÄÇÏ¸é ³ª´Â ±×·¸°Ô ÇÏÁö ¸øÇ߱⠶§¹®ÀÔ´Ï´Ù.
¿À·£ ¼¼¿ù µ¿¾È MySQL 5.1 ÆÄƼ¼ÇÀ» »ç¿ëÇϴµ¥ ÀÖ¾î¼, ´ÙÁß Ä÷³¿¡ ÀÇÇÑ ÆÄƼ¼ÇÀÇ Á߿伺À» ÆÄÇÐÇÏÁö ¸øÇß½À´Ï´Ù. LESS THAN (10,10) ±¸¹®ÀÇ Àǹ̴ ¹«¾ùÀԴϱî? ±×¸®°í ´ÙÀ½ ÆÄƼ¼ÇÀ¸·Î LESS THAN (10,20)ÀÌ ¼³Á¤µÈ´Ù¸é ¾î¶² ÀÏÀÌ ¹ß»ýÇմϱî? (20,30)°ú °°ÀÌ ¿ÏÀüÈ÷ ´Ù¸¥ ½ÖÀ» Àû¿ëÇÑ´Ù¸é ¾î¶»°Ô µÇ°Ú½À´Ï±î? ÀÌ·¯ÇÑ ¸ðµç Áú¹®¿¡ ´äº¯ÀÌ ÇÊ¿äÇϰí, ´äº¯Çϱâ Àü¿¡ ¿ì¸®°¡ ÇÔ²² ´Ù·ç°í ÀÖ´Â À̰Ϳ¡ ´ëÇØ¼ ´õ ¸¹Àº ÀÌÇØ°¡ ÇÊ¿äÇÕ´Ï´Ù.
óÀ½¿¡´Â MySQL ¿£Áö´Ï¾î °¡¿îµ¥µµ ¾à°£ÀÇ È¥µ¿ÀÌ ÀÖ¾ú½À´Ï´Ù. ±×¸®°í ±×°Í »Ó¸¸ ¾Æ´Ï¶ó ³ª´Â ¾î¸®¼®¾ú½À´Ï´Ù! ¸ðµç ÆÄƼ¼ÇÀÇ Ã¹ ¹øÂ° ¹üÀ§ °ªÀº ¸¶Ä¡ ´Ü ÇϳªÀÇ Ä÷³À¸·Î ºÐÇҵǾîÁø °Í°ú °°ÀÌ ½ÇÁúÀûÀÎ °ªÀº ÀüºÎ ´Ù¸£´Ù°í ¹Ï°í ÀÖ¾ú½À´Ï´Ù. ±×·¯³ª ÀÌ °æ¿ì¸¸ÀÌ ¾Æ´Ï¾ú½À´Ï´Ù. ´ÙÀ½ ¿¹Á¦¸¦ º¸°Ú½À´Ï´Ù.
CREATE TABLE p1_single (
a INT,
b INT,
c INT
)
PARTITION BY RANGE COLUMNS (a)
(
PARTITION p01 VALUES LESS THAN (10),
PARTITION p02 VALUES LESS THAN (20),
PARTITION p03 VALUES LESS THAN (30),
PARTITION p04 VALUES LESS THAN (40),
PARTITION p05 VALUES LESS THAN (MAXVALUE)
);
À̰ÍÀº p1 Å×ÀÌºí¿¡ ÇØ´çµÇÁö ¾Ê½À´Ï´Ù. ¸¸¾à¿¡ p1dp (10, 1, 1)À» »ðÀÔÇÑ´Ù¸é, ±×°ÍÀº ù ¹øÂ° ÆÄƼ¼Ç¿¡ Æ÷Ç﵃ °ÍÀÔ´Ï´Ù. p1_single¿¡ ´ëÀÔÇϸé 2¹øÂ° ÆÄƼ¼Ç¿¡ Æ÷Ç﵃ °ÍÀÔ´Ï´Ù.
(10,1)Àº (10, 10)º¸´Ù À۱⠶§¹®ÀÔ´Ï´Ù. ¸¸¾à ¿ÀÁ÷ ù ¹øÂ° °ªÀ» ÃÊÁ¡À» µÐ °æ¿ì¶ó¸é, Æ©ÇÃÀÌ ¾Æ´Ñ ´ÜÀÏ °ªÀ» ºñ±³ÇÏ¿´À» °ÍÀÔ´Ï´Ù.
ÀÌÁ¦ºÎÅÍ ¾î·Á¿î ºÎºÐÀÔ´Ï´Ù. µ¥ÀÌÅÍ(row)°¡ ¾îµð·Î ¹èÄ¡µÉÁö °áÁ¤ÀÌ ÇÊ¿äÇÒ ¶§ ¹«½¼ ÀÏÀÌ ¹ß»ýÇմϱî? (10,9) < (10,10)¿Í °°Àº ÀÛ¾øÀ» ¾î¶»°Ô ºñ±³ Çմϱî? ´äº¯Àº °£´ÜÇÕ´Ï´Ù: µÎ°³ÀÇ ·¹Äڵ带 Á¤·ÄÇÏ¿© ºñ±³ÇÏ´Â ¹æ¹ýÀÌ »ç¿ëµË´Ï´Ù.
a=10
b=9
(a,b) < (10,10) ?
# ´ÙÀ½°ú °°ÀÌ Æò°¡ ÇÕ´Ï´Ù.:
(a < 10)
OR
((a = 10) AND ( b < 10))
# ´ÙÀ½°ú °°ÀÌ º¯È¯À» ÇÕ´Ï´Ù.:
(10 < 10)
OR
((10 = 10) AND ( 9 < 10))
¸¸¾à¿¡ 3°³ÀÇ Ä÷³°ú º¹ÀâÇÑ Ç¥ÇöÀÌ ÀÖ´Ù°í ÇÏ¿©µµ, ´õ ÀÌ»ó º¹ÀâÇÏÁö ¾Ê½À´Ï´Ù. ¿ì¼± ù ¹øÂ° Ç׸ñ¿¡ ´ëÇØ¼ ÀûÀº ºñ¿ë(³·Àº ¸®¼Ò½ºÀÇ »ç¿ëÀ» ÀǹÌÇÔ)À¸·Î Å×½ºÆ®ÇÕ´Ï´Ù. ¸¸¾à µÎ°³ ÀÌ»óÀÇ ÆÄƼ¼Ç¿¡¼ ÀÏÄ¡ÇÏ´Â °æ¿ì¶ó¸é, µÎ ¹øÂ° Ç׸ñÀ» Å×½ºÆ® ÇÕ´Ï´Ù. ±×·¸°Ô ÇÑ ´ÙÀ½¿¡µµ Çϳª ÀÌ»óÀÇ Èĺ¸ ÆÄƼ¼ÇÀ» °¡Áö°í ÀÖ´Ù¸é, ´ÙÀ½ ¼¼ ¹øÂ° Ç׸ñÀ» Å×½ºÆ®ÇÕ´Ï´Ù.
¾Æ·¡ÀÇ ±×¸²Àº ¼¼ °³ÀÇ Æò°¡ ±â·ÏÀÌ ÆÄƼ¼ÇÀÇ Á¤ÀǸ¦ ÅëÇØ¼ Å×ÀÌºí¿¡ »ðÀԵǴ °úÁ¤À» º¸¿©ÁÝ´Ï´Ù.
(10,10),
(10,20),
(10,30),
(10, MAXVALUE)
±×¸² 1. ù ¹øÂ° (ºñ±³)°ªÀÌ ÆÄƼ¼Ç Á¤ÀÇÀÇ Ã¹ ¹øÂ° ¹üÁÖº¸´Ù ÀÛÀº °æ¿ì¿¡ ¸ðµç °ÍÀÌ ½±½À´Ï´Ù. µ¥ÀÌÅÍ(row)´Â ¿©±â¿¡ Æ÷ÇԵ˴ϴÙ.
 |
±×¸² 2. Æ©Çà ºñ±³. ù ¹øÂ° (ºñ±³)°ªÀÌ ÆÄƼ¼Ç Á¤ÀÇÀÇ Ã¹ ¹øÂ° ¹üÁÖ¿Í °°À» ¶§, µÎ ¹øÂ° Ç׸ñÀ» ºñ±³ÇØ¾ß ÇÕ´Ï´Ù. ³²Àº Çϳª°¡ µÎ ¹øÂ° ¹üÀ§º¸´Ù ÀÛ´Ù¸é, µ¥ÀÌÅÍ(row)´Â ¿©±â¿¡ Æ÷ÇԵ˴ϴÙ.
 |
±×¸² 3. Æ©Çà ºñ±³. ù ¹øÂ° (ºñ±³)°ª°ú µÎ¹ø쨰 (ºñ±³)°ª µÑ ´Ù (ù¹øÂ°) ÇØ´ç ¹üÁÖ °ª°ú µ¿ÀÏÇÕ´Ï´Ù. Æ©ÇÃÀº Á¤ÀÇµÈ ¹üÀ§º¸´Ù ÀÛÁö ¾ÊÀ¸¹Ç·Î, ¿©±â¿¡ Æ÷ÇÔµÇÁö ¾Ê½À´Ï´Ù. ´ÙÀ½´Ü°è·Î ³Ñ¾î°©´Ï´Ù.
 |
±×¸² 4. Æ©Çà ºñ±³. ´ÙÀ½ ¹üÀ§¸¦ º¸¸é, ù ¹øÂ° (ºñ±³)°ªÀº °°°í, µÎ ¹øÂ° (ºñ±³) °ªÀº ÀÛ½À´Ï´Ù. µû¶ó¼ Æ«ÇÃÀº ÀÛ°í µ¥ÀÌÅÍ(row)´Â ¿©±â¿¡ Æ÷ÇԵ˴ϴÙ.
 |
ÀÌ¿Í °°Àº ¼öÄ¡ÀÇ µµ¿òÀ¸·Î, ¿ì¸®´Â ´ÙÁß Ä÷³À¸·Î ÆÄ´Ï¼ÇµÈ Å×ÀÌºí¿¡ ·¹Äڵ带 »ðÀÔÇÏ´Â Àýü¿¡ ´ëÇØ¼ ´õ ¸¹Àº ÀÌÇØ¸¦ ÇÒ ¼ö ÀÖ°Ô µÇ¾ú½À´Ï´Ù. À̰ÍÀÌ ÀÌ·ÐÀÌ µÇ¾ú½À´Ï´Ù. ³»°¡ Çß´ø °Íº¸´Ù ÈξÀ ´õ ½±°Ô »õ·Î¿î ±â´ÉÀ» ÆÄ¾ÇÇÏ´Â °ÍÀ» µ½±â À§Çؼ, °¨°¢ÀûÀ¸·Î ÀÌÇØ ÇÒ·Á°í ÇÏ´Â µ¶Àڵ鿡°Ô ´Ù¸¥ ¿¹Á¦¸¦ Á¦°øÇÏÀÚ°í ÇÕ´Ï´Ù. ·±Ä¡ÆÐµå¿¡ ÀÖ´Â MySQL test µ¥ÀÌÅͺ£À̽ºÀÇ employees Å×À̺íÀÇ ¸î °¡Áö¸¦ ¼öÁ¤ÇÏ¿© »ç¿ëÇÕ´Ï´Ù.
CREATE TABLE employees (
emp_no int(11) NOT NULL,
birth_date date NOT NULL,
first_name varchar(14) NOT NULL,
last_name varchar(16) NOT NULL,
gender char(1) DEFAULT NULL,
hire_date date NOT NULL
) ENGINE=MyISAM
PARTITION BY RANGE COLUMNS(gender,hire_date)
(PARTITION p01 VALUES LESS THAN ('F','1990-01-01') ,
PARTITION p02 VALUES LESS THAN ('F','2000-01-01') ,
PARTITION p03 VALUES LESS THAN ('F',MAXVALUE) ,
PARTITION p04 VALUES LESS THAN ('M','1990-01-01') ,
PARTITION p05 VALUES LESS THAN ('M','2000-01-01') ,
PARTITION p06 VALUES LESS THAN ('M',MAXVALUE) ,
PARTITION p07 VALUES LESS THAN (MAXVALUE,MAXVALUE)
À§ÀÇ ¿¹Á¦¿Í ´Ù¸£°Ô À̰ÍÀº ÀÌ·ÐÀûÀÎ Ãø¸éÀ» º¸¸é ³Ê¹« ¸¹Àº ¸ðÈ£ÇÔÀ» °¡Áö°í ÀÖÀ½À» ¾Ë ¼ö ÀÖ½À´Ï´Ù. ù ¹øÂ° ÆÄƼ¼ÇÀº 1990³â ÀÌÀü, µÎ ¹øÂ° ÆÄƼ¼Ç¿¡¼´Â 1990³â¿¡¼ 2000³â »çÀÌ, ±×¸®°í ¼¼ ¹øÂ°ÆÄƼ¼ÇÀº ³²¾ÆÀÖ´Â °í¿ëµÈ ¿©ÀÚ Á÷¿øÀ» ÀúÀåÇÕ´Ï´Ù. ÆÄƼ¼Ç p04¿¡¼ p06µµ ºñ½ÁÇÑ ÄÉÀ̽ºÀÌÁö¸¸, ³²ÀÚ Á÷¿øÀ» ÀúÀåÇÕ´Ï´Ù. ¸¶Áö¸· ÆÄƼ¼ÇÀÇ Á¶ÀÛÀÇ °æ¿ì: ´©±º°¡°¡ ÀÌ ÆÄƼ¼Ç¿¡ ÀúÀåÀÌ µÇ±â À§Çؼ´Â ¾îµò°¡¿¡ ½Ç¼ö°¡ ÀÖ¾î¾ß ÇÕ´Ï´Ù.
¸¶Áö¸· ¹®ÀåÀ» Àо¸é, ¿Ã¹Ù¸¥ ¹®ÀåÀÎÁö È®ÀÎÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù. µ¥ÀÌÅÍ(row)°¡ ¾î¶² ÆÄƼ¼Ç¿¡ ÀúÀåµÇ´ÂÁö ¾î¶»°Ô ¾Ë ¼ö ÀÖÀ»±î¿ä?
µÎ°¡Áö ¹æ¹ýÀÌ ÀÖ½À´Ï´Ù. ù ¹øÂ° ¹æ¹ýÀº Á¤ÀÇ Çϴµ¥ »ç¿ëµÇ´Â µ¿ÀÏÇÑ Á¶°ÇÀ» °¡Áø ÁúÀǸ¦ ÇÏ´Â °ÍÀÔ´Ï´Ù.
SELECT
CASE
WHEN gender = 'F' AND hire_date < '1990-01-01'
THEN 'p1'
WHEN gender = 'F' AND hire_date < '2000-01-01'
THEN 'p2'
WHEN gender = 'F' AND hire_date < '2999-01-01'
THEN 'p3'
WHEN gender = 'M' AND hire_date < '1990-01-01'
THEN 'p4'
WHEN gender = 'M' AND hire_date < '2000-01-01'
THEN 'p5'
WHEN gender = 'M' AND hire_date < '2999-01-01'
THEN 'p6'
ELSE
'p7'
END as p,
COUNT(*) AS rows
FROM employees
GROUP BY p;
+------+-------+
| p | rows |
+------+-------+
| p1 | 66212 |
| p2 | 53832 |
| p3 | 7 |
| p4 | 98585 |
| p5 | 81382 |
| p6 | 6 |
+------+-------+
¸¸¾à MyISAM ¶Ç´Â ARCHIVE Å×À̺íÀ̶ó¸é, INFORMATION_SCHEMA¿¡¼ Á¦°øµÇ´Â Åë°è¸¦ ½Å·Ú ÇÒ ¼ö ÀÖ½À´Ï´Ù.
SELECT
partition_name part,
partition_expression expr,
partition_descript-xion descr,
table_rows
FROM
INFORMATION_SCHEMA.partitions
WHERE
TABLE_SCHEMA = schema()
AND TABLE_NAME='employees';
+------+------------------+-------------------+------------+
| part | expr | descr | table_rows |
+------+------------------+-------------------+------------+
| p01 | gender,hire_date | 'F','1990-01-01' | 66212 |
| p02 | gender,hire_date | 'F','2000-01-01' | 53832 |
| p03 | gender,hire_date | 'F',MAXVALUE | 7 |
| p04 | gender,hire_date | 'M','1990-01-01' | 98585 |
| p05 | gender,hire_date | 'M','2000-01-01' | 81382 |
| p06 | gender,hire_date | 'M',MAXVALUE | 6 |
| p07 | gender,hire_date | MAXVALUE,MAXVALUE | 0 |
+------+------------------+-------------------+------------+
InnoDB ¿£ÁøÀ» »ç¿ëÇÏ´Â °æ¿ì¿¡´Â, À§ÀÇ °ªÀº ±Ù»çÄ¡À̸ç, Á¤È®ÇÑ °ªÀÌ ÇÊ¿äÇÏ´Ù¸é, INFORMATION_SCHEMA´Â ½Å·Ú ÇÒ ¼ö ¾ø½À´Ï´Ù.
ÇÑ °¡Áö Àǹ®Á¡Àº À§ÀÇ ¸ðµç ¼³¸í°ú ¼º´É¿¡ °ü·ÃµÈ °ÍµéÀº, ¾ÆÁ÷±îÁö ¹ÌÁö¼öÀÔ´Ï´Ù. ÀÌ¿Í °°Àº partition pruningÀ» °³¼± »çÇ×À¸·Î º¼ ¼ö ÀÖ°Ú½À´Ï±î? ´äº¯Àº ºÐ¸íÈ÷ '±×·¸´Ù' ÀÔ´Ï´Ù. 5.1 ¹öÀü°ú ´Þ¸®, 5.5¿¡¼´Â ³¯Â¥»Ó¸¸ ¾Æ´Ï¶ó, ¸ðµç ÆÄƼ¼ÇÀº COLUMNS Ű¿öµå·Î Á¤ÀÇµÈ partition pruningÀ» »ç¿ëÇÏ´Â, µÎ °¡Áö ±â´ÉÀÇ ÆÄƼ¼Ç´×À» Áö¿øÇÕ´Ï´Ù. ´ÙÀ½À» º¸¸é:
select count(*) from employees where gender='F' and hire_date < '1990-01-01';
+----------+
| count(*) |
+----------+
| 66212 |
+----------+
1 row in set (0.05 sec)
explain partitions select count(*) from employees where gender='F' and hire_date < '1990-01-01'\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: employees
partitions: p01
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 300024
Extra: Using where
ù ¹øÂ° ÆÄƼ¼ÇÀ» Á¤ÀÇÇÏ´Â Á¶°ÇÀ» »ç¿ëÇÏ¿©, ¸Å¿ì ÃÖÀûÈµÈ Äõ¸®¸¦ ¾ò¾ú½À´Ï´Ù. ±× »Ó¸¸ ¾Æ´Ï¶ó, ÀϺΠÁ¶°ÇÀº ºÒÇÊ¿äÇÑ ºÎºÐÀÌ Á¦°ÅµÈ ÆÄƼ¼ÇÀ¸·Î ºÎÅÍ (°Ë»ö) ÇýÅÃÀ» ¹Þ¾Ò½À´Ï´Ù.
select count(*) from employees where gender='F';
+----------+
| count(*) |
+----------+
| 120051 |
+----------+
1 row in set (0.12 sec)
explain partitions select count(*) from employees where gender='F'\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: employees
partitions: p01,p02,p03,p04
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 300024
Extra: Using where
À̰ÍÀº º¹ÀâÇÑ À妽º¿¡ »ç¿ëµÈ °Í°ú °°Àº ¾Ë°í¸®Áò ÀÔ´Ï´Ù. Á¶°ÇÀÌ À妽ºÀÇ ¿ÞÂÊ ºÎºÐÀ» ÀÇ¹Ì ÇÏ´Â °æ¿ì, MySQLÀº ±×°ÍÀ» »ç¿ëÇÕ´Ï´Ù. ¸¶Âù°¡Áö·Î, ´ç½ÅÀº ÆÄƼ¼Ç Á¤ÀÇÀÇ ¿ÞÂÊ ºÎºÐÀ» ÂüÁ¶ ÇÑ´Ù¸é, °¡´ÉÇÑ ÃÖ´ëÇÑ ºÒÇÊ¿äÇÑ ºÎºÐÀ» Á¦¿ÜÇÕ´Ï´Ù. ÆÄƼ¼Ç Á¤ÀÇÀÇ ¿À¸¥ÂÊ ºÎºÐÀ» ÂüÁ¶ÇÏ´Â °æ¿ì¿¡´Â º¹ÇÕ À妽º¿Í ºÒÇÊ¿äÇÑ ºÎºÐÀÌ Á¦°ÅµÈ ÆÄƼ¼ÇÀÌ ÀÛµ¿ÇÏÁö ¾Ê½À´Ï´Ù.
select count(*) from employees where hire_date < '1990-01-01';
+----------+
| count(*) |
+----------+
| 164797 |
+----------+
1 row in set (0.18 sec)
explain partitions select count(*) from employees where hire_date < '1990-01-01'\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: employees
partitions: p01,p02,p03,p04,p05,p06,p07
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 300024
Extra: Using where
ù ¹øÂ°¸¦ »ç¿ëÇÏÁö ¾Ê°í, ÆÄƼ¼Ç Á¤ÀÇÀÇ µÎ ¹øÂ° ºÎºÐÀ» ÂüÁ¶Çϸé, Àüü Å×À̺íÀ» °Ë»öÇÕ´Ï´Ù. À̰ÍÀº Ç×»ó ÆÄƼ¼Ç »ý¼º°ú Äõ¸® µðÀÚÀÎÀ» ÇÒ ¶§, °í·ÁÇØ µÎ¾î¾ß ÇÕ´Ï´Ù.
»ç¿ë¼º °³¼±: TRUNCATE PARTITION
ÆÄƼ¼Ç ID °¡Àå ¸Å·ÂÀûÀÎ ±â´É Áß Çϳª´Â °ÅÀÇ Áï½Ã ´ë·®ÀÇ µ¥ÀÌÆ®¸¦ Á¦°ÅÇÏ´Â ´É·ÂÀÔ´Ï´Ù. ÀÌ ½ºÅ°¸¶´Â DBAµéÀÌ ·Î±× µ¥ÀÌÅ͸¦ ±â·ÏÇÏ´Â ³¯Â¥¸¦ ±âÁØÀ¸·Î Á¤ÀÇµÈ ÆÄƼ¼ÇµÈ Å×ÀÌºí¿¡¼, Á¤±âÀûÀ¸·Î ¿À·¡µÈ ±â·ÏÀÌ º¸°üµÈ ÆÄƼ¼ÇÀ» »èÁ¦ÇÏ´Â ¹æ¹ýÀ¸·Î ¸Å¿ì Àα⸦ ²ø°í ÀÖ½À´Ï´Ù. ÀÌ ¹æ¹ýÀº ¾ÆÁÖ Àß ÀÛµ¿ÇÕ´Ï´Ù. ù ¹øÂ° (°¡Àå ¿À·¡µÈ ±â·ÏÀ» °¡Áø) ÆÄƼ¼ÇÀ» »èÁ¦ Çϰí, ³¡¿¡ (Ãֽбâ·ÏÀ» ÀúÀåÇÒ) »õ·Î¿î ÆÄƼ¼ÇÀ» Ãß°¡ÇÕ´Ï´Ù.
¸ðµÎ ÁÁ½À´Ï´Ù. ´ÜÁö ³¡ºÎÅÍ Àß¶ó³»¾ß ÇÕ´Ï´Ù. ÇÏÁö¸¸ Áß°£¿¡ ÀÖ´Â ÆÄƼ¼ÇÀ» Á¦°ÅÇØ¾ßÇÏ´Â °æ¿ì¿¡´Â »óȲÀÌ ¿øÈ°ÇÏ°Ô ÁøÇàµÇÁö ¾Ê½À´Ï´Ù. ÀÌ·± °æ¿ì¿¡ ´ëÇØ¼ ¾Æ¹« ¹®Á¦¾øÀÌ ÆÄƼ¼ÇÀ» »èÁ¦ ÇÒ ¼ö ÀÖ½À´Ï´Ù. ±×·¯³ª ´ÜÁö ÆÄƼ¼ÇÀ» ºñ¿ì´Â °ÍÀ» ¿øÇÑ´Ù¸é, »ó´çÈ÷ ¾î·¯¿î ¹®Á¦¿¡ Á÷¸éÇÑ °ÍÀÔ´Ï´Ù. ÆÄƼ¼ÇÀ¸·Î ºÎÅÍ ¸ðµç ·¹Äڵ带 Á¦°ÅÇϱâ À§Çؼ ÇÒ ¼ö ÀÖ´Â °Í:
- DELETE ±¸¹®À» »ç¿ëÇÏ¿©, Àß·ÁÁø ÆÄƼ¼ÇÀÇ ÀåÁ¡ÀÇ ´ëºÎºÐÀ» Æ÷±âÇÏ´Â ¹æ¹ý
- DROP PARTITIONÀ» »ç¿ëÇÑ ´ÙÀ½, REORGANIZE PARTITIONSÀ¸·Î ´Ù½Ã ¸¸µé·Á¸é, ÀÌÀüÀÇ ¼±Åú¸´Ù ´õ ¸¹Àº ºÎÇϰ¡ ¹ß»ýÇÕ´Ï´Ù.
MySQL 5.5¹öÀü¿¡¼´Â DROP PARTITION°ú °°Áö¸¸, ÆÄƼ¼ÇÀÌ »èÁ¦µÇ´Â ´ë½Å¿¡ ´Ù½Ã »ç¿ëÇÒ Áغñ°¡ µÇ¾îÁö´Â TRUNCATE PARTITION ±¸¹®À» ¼Ò°³ÇÕ´Ï´Ù.
TRUNCATE PARTITION ±¸¹®Àº ¸ðµç DBAÀÇ µµ±¸»óÀÚ¿¡ ÀÖ¾î¾ß ÇÕ´Ï´Ù.
´õ ¹Ì¼¼ÇÑ Á¶Á¤: TO_SECONDS
º¸³Ê½º·Î ÆÄƼ¼Ç ±â´É °³¼± ÆÐŰÁö´Â ³¯Â¥¿Í ½Ã°£ Ä÷³À» Á¶ÀÛÇÏ´Â »õ·Î¿î ÇÔ¼ö°¡ ÁغñµÇ¾î ÀÖ½À´Ï´Ù. TO_SECONDS¿Í °°Àº ±â´ÉÀ¸·Î ³¯Â¥ ½Ã°£ Ä÷³À» "0"³â ºÎÅÍ ÃÊ ´ÜÀ§·Î º¯È¯ÇÒ ¼ö ÀÖ½À´Ï´Ù. ¸¸¾à ÇÏ·ç º¸´Ù ÀÛÀº ½Ã°£ °£°ÝÀ¸·Î ÆÄƼ¼ÇÇÏ·Á´Â °æ¿ì¿¡ À¯¿ëÇÑ ±â´ÉÀÔ´Ï´Ù.
Çâ»óµÈ ±â´ÉÀÇ ³ª¸ÓÁö ºÎºÐ°ú °°ÀÌ, TO_SECONDSÀ¸·Î ÆÄƼ¼ÇÀ» Àß¶ó³»´Â °ÍÀº ³¯Â¥ ÇÔ¼öÀÇ ¼ö°¡ ¼¼ °¡Áö°¡ µÊÀ¸·Î½á, È¿À²ÀûÀÎ ÆÄƼ¼Ç´×À» ÇÒ ¼ö ÀÖ½À´Ï´Ù.
TO_DAYS´Â, FROM_DAYS·Î º¯È¯ÇÒ ¼ö ÀÖÁö¸¸, TO_SECONDS¿¡ ´ëÇÑ ±×·± ±â´ÉÀº ¾ø½À´Ï´Ù. ÇÏÁö¸¸ ÀÌ·± °ÍÀ» ¸¸µå´Â °ÍÀº ¾î·ÆÁö ¾Ê½À´Ï´Ù.
drop function if exists from_seconds;
delimiter //
create function from_seconds (secs bigint)
returns DATETIME
begin
declare days INT;
declare secs_per_day INT;
DECLARE ZH INT;
DECLARE ZM INT;
DECLARE ZS INT;
set secs_per_day = 60 * 60 * 24;
set days = floor(secs / secs_per_day);
set secs = secs - (secs_per_day * days);
set ZH = floor(secs / 3600);
set ZM = floor(secs / 60) - ZH * 60;
set ZS = secs - (ZH * 3600 + ZM * 60);
return CAST(CONCAT(FROM_DAYS(days), ' ', ZH, ':', ZM, ':', ZS) as DATETIME);
end //
delimiter ;
ÀÌ·± »õ·Î¿î ¹«±â·Î ¹«ÀåÇÑ ¿ì¸®´Â ÇÏ·çµµ ¾È µÇ´Â ½Ã°£À» ±âÁØÀ¸·Î Á¤ÀÇÇÑ ÆÄƼ¼Ç°ú °°Àº Å×À̺íÀ» ÀڽŠÀÖ°Ô ¸¸µé ¼ö ÀÖ½À´Ï´Ù.
CREATE TABLE t2 (
dt datetime
)
PARTITION BY RANGE (to_seconds(dt))
(
PARTITION p01 VALUES LESS THAN (to_seconds('2009-11-30 08:00:00')) ,
PARTITION p02 VALUES LESS THAN (to_seconds('2009-11-30 16:00:00')) ,
PARTITION p03 VALUES LESS THAN (to_seconds('2009-12-01 00:00:00')) ,
PARTITION p04 VALUES LESS THAN (to_seconds('2009-12-01 08:00:00')) ,
PARTITION p05 VALUES LESS THAN (to_seconds('2009-12-01 16:00:00')) ,
PARTITION p06 VALUES LESS THAN (MAXVALUE)
);
show create table t2\G
*************************** 1. row ***************************
Table: t2
Create Table: CREATE TABLE `t2` (
`dt` datetime DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
/*!50500 PARTITION BY RANGE (to_seconds(dt))
(PARTITION p01 VALUES LESS THAN (63426787200) ENGINE = MyISAM,
PARTITION p02 VALUES LESS THAN (63426816000) ENGINE = MyISAM,
PARTITION p03 VALUES LESS THAN (63426844800) ENGINE = MyISAM,
PARTITION p04 VALUES LESS THAN (63426873600) ENGINE = MyISAM,
PARTITION p05 VALUES LESS THAN (63426902400) ENGINE = MyISAM,
PARTITION p06 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) */
COLUMNS Ű¿öµå¸¦ »ç¿ëÇÏÁö ¾Ê±â ¶§¹®¿¡ (±×¸®°í ¿ì¸®°¡ COLUMNS °ú ÇÔ¼öÀÇ È¨ÇÕÀ» Çã¿ëÇÏÁö ¾ÊÀº ÀÌÀ¯·Î ÇÒ ¼ö ¾ø¾ú´ø) TO_SECONDS ÇÔ¼öÀÇ °á°ú·Î Á¤ÀǵǾîÁø Å×ÀÌºí ¾È¿¡ °ªÀ» ±â·ÏµÇ¾ú½À´Ï´Ù.
±×·¯³ª »õ·Î¿î ±â´É´öºÐ¿¡,
¿À·¡µÈ ºí·Î±× Æ÷½ºÆ®¿¡¼ º»°Í °°Àº °ªÀ» º¯È¯ÇÏÁö ¾Ê¾Æµµ »ç¶÷ÀÌ ÀÐÀ» ¼ö ÀÖ´Â °ªÀ» »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.
select
partition_name part,
partition_expression expr,
from_seconds(partition_descript-xion) descr,
table_rows
FROM
INFORMATION_SCHEMA.partitions
WHERE
TABLE_SCHEMA = 'test'
AND TABLE_NAME='t2';
+------+----------------+---------------------+------------+
| part | expr | descr | table_rows |
+------+----------------+---------------------+------------+
| p01 | to_seconds(dt) | 2009-11-30 08:00:00 | 0 |
| p02 | to_seconds(dt) | 2009-11-30 16:00:00 | 0 |
| p03 | to_seconds(dt) | 2009-12-01 00:00:00 | 0 |
| p04 | to_seconds(dt) | 2009-12-01 08:00:00 | 0 |
| p05 | to_seconds(dt) | 2009-12-01 16:00:00 | 0 |
| p06 | to_seconds(dt) | 0000-00-00 00:00:00 | 0 |
+------+----------------+---------------------+------------+
¿ä¾à
MySQL 5.5¹öÀüÀº ÆÄƼ¼ÇÀ» »ç¿ëÇÏ´Â »ç¿ëÀÚ¿¡°Ô È®½ÇÈ÷ ÁÁÀº ¼Ò½ÄÀÔ´Ï´Ù. (ÀÀ´ä ½Ã°£°ú °°Àº ¼º´ÉÀ» Æò°¡ÇÏ´Â °æ¿ì¶ó¸é) ¼º´É¿¡ Á÷Á¢ÀûÀÎ °³¼±Àº ¾ø¾úÁö¸¸, ±â´ÉÇâ»óÀ¸·Î »ç¿ëÀÌ ½¬¿öÁö°í, ½Ã°£À» Àý¾àÇÒ ¼ö ÀÖ´Â »õ·Î¿î TRUNCATE PARTITION ±¸¹®°ú °°Àº °á°ú·Î DBA³ª ÃÖÁ¾ »ç¿ëÀÚÀÇ ½Ã°£À» ¸¹ÀÌ Àý¾àÇÒ ¼ö ÀÖ½À´Ï´Ù.