안녕하세요
mysql 에서 아래 쿼리를 실행했습니다.
SELECT * FROM nn.dataset_2day_normalize_60 where date >20120331 and date < 20150101;
DB Type은 MyISam 입니다.
index는 date에 걸어 놓았고
Data는 column 이 1684개 입니다. (자료형은 Float 입니다.)
전체 테이블은 9G 정도 되는데
위의 쿼리 시행 시간이 30분을 돌려도 끝나지 않습니다.
계속 놔두면 언젠가 끝나기는 합니다.
어떻게 해야 속도가 빨라질까요?
EXPLAIN SELECT * FROM nn.dataset_2day_normalize_60 where date >20120331 and date < 20150101;
½ÇÁ¦·Î À妽º°¡ Àß ÀÛµ¿ÇÏ´ÂÁö È®ÀÎÇϽÅÈÄ ¹®Á¦°¡ µÈ´Ù¸é Force IndexµîÀ¸·Î °Á¦·Î ¼³Á¤ÇÒ ÇÊ¿äµµ ÀÖ½À´Ï´Ù.
±×¸®°í SELECT Á¶È¸ Ä÷³Àº ÇÊ¿äÇÑ Ä÷³¸¸ ¸í½ÃÇÏ´Â°Ô ÁÁ½À´Ï´Ù.
explainÀ» ¸ÕÀú ÇØ ºÁ¾ß°Ú³×¿ä
id 1
select_type : Simple
Table : dataset_2day_normalize_60
partitions : null
type : range
possible_keys :idx1
Key : idx1
key_len : 4
ref : null
rows: 639588
filtered : 100.00
Extra : using index condition
À¸·Î ³ª¿À´Âµ¥µµ ´À¸³´Ï´Ù. (idx1°¡ date index ÀÔ´Ï´Ù.)
¶Ç Çغ¼ ¼ö ÀÖ´Â °ÍÀÌ ÀÖÀ»±î¿ä?
¿ø·¡ index ¾ÈŸ´Âµ¥ ÀÌ°Í³Ö¾î °Á¦·Î Å¿ì¸é ¿ÀÈ÷·Á ´À·ÁÁú ¼ö ÀÖ½À´Ï´Ù.
date >20120331 and date < 20150101 ÀÌ Á¶°ÇÀ¸·Î ºÁ¼´Â ±â°£ Á¶°ÇÀÌ ¸Å¿ì ³Ð¾î
index¸¦ ¾ÈÅ» °ÍÀ¸·Î º¸À̰ŵç¿ä.
index¸¦ ¸¸µé¾ú´Ù°í Çصµ
Àüü °Ç¼ö¿¡ ºñÇØ select °Ç¼ö°¡ ÀÏÁ¤% º¸´Ù ¸¹À¸¸é
full select °¡
»¡¶ó ±×·¸°Ô ó¸® µË´Ï´Ù.
ºÐÇÒÀÌ ÇÊ¿äÇØ º¸À̳׿ä.
where Á¶°Ç ¹üÀ§¸¦ ºÁ¼
Index¸¦ ¾ÈÅ» °¡´É¼ºµµ º¸À̳׿ä.
¹Ýº¹ ½ÇÇà ÇÏ´Â °ÍÀÌ ´õ ºü¸¦ ¼ö ÀÖ½À´Ï´Ù
Àå±âÀûÀ¸·Î´Â
Å×À̺íÀ» Á¤±ÔÈ(¼öÁ÷ºÐÇÒ Æ÷ÇÔ), ÆÄƼ¼Å´×ÀÌ ÇÊ¿äÇØ º¸ÀÔ´Ï´Ù.
WHERE Àý¿¡ ÇØ´çÇÏ´Â µ¥ÀÌÅͶû idx¸¸ ³²°Ü ³õ°í, ºÐ¸®µÇ¾î ÀÖ´Â Å×ÀÌºí¿¡¼ ³ª¸ÓÁö Ä÷³ °ªÀ» ¼öÁýÇÒ ¼ö ÀÖµµ·Ï ±¸¼ºÇÏ¸é ¸î Ãʵµ ¾È °É¸± ¹®Á¦ °°½À´Ï´Ù.
°¡´ÉÇϽøé DB¸¦ SSD³ª Á» ´õ ºü¸¥ ȯ°æÀ¸·Î ÀÎÇÁ¶ó ȯ°æÀ» ¹Ù²ã º¸½Ã´Â °Íµµ ¹æ¹ýÀÏ °Í °°½À´Ï´Ù.
1ȸ ¼ºÀ¸·Î ÀڷḦ ¸¸µå´Â ÁßÀ̾î¼
Àüü µ¥ÀÌÅÍ´Â ¸ðµÎ ÇÊ¿äÇÑ »óȲÀÔ´Ï´Ù.
DB´Â SSD¿¡ ¿Ã¶ó°¡ ÀÖ½À´Ï´Ù
À§¿¡ ´äº¯ ÁֽŠ°Í º¸´Ï±î °Á¦ Force´Â ¿ÀÈ÷·Á ´À¸± ¼ö ÀÖ´Ù·Î ÇϽôõ¶ó°í¿ä.
¼ýÀÚ¸¦ ÁÙ¿©¼ ¿©·¯¹ø ÇÏ´Â°Ô ¹æ¹ýÀÏ°Í °°½À´Ï´Ù.
from (
SELECT id°ª
FROM nn.dataset_2day_normalize_60 where date >20120331 and date < 20150101
) b join nn.dataset_2day_normalize_60 a on b.id°ª = a.id°ª
ÀÌ·¸°Ô Çѹø Çغ¸¼¼¿ä
select a.*
from (
SELECT code, date
FROM nn.dataset_2day_normalize_60 where date >20120331 and date < 20150101
) b join nn.dataset_2day_normalize_60 a on ( (b.code = a.code) and (b.date = a.date) )
select a.*
from (
SELECT code, date
FROM nn.dataset_2day_normalize_60 where date >= 20120101 and date < 20120201
) b join nn.dataset_2day_normalize_60 a on ((b.code = a.code) and (b.date = a.date));
º¸´Ù
SELECT * FROM nn.dataset_2day_normalize_60 where date >= 20120101 and date < 20120201;
°¡ ºü¸¥ °Í °°½À´Ï´Ù.
¿ù´ÜÀ§ Á¤µµ·Î where Á¶°Ç ÁÙ¿©¼ ¹Ýº¹ ½ÇÇàÇϽô °ÍÀÌ
°¡Àå »¡¸® ÁøÇàÇÒ ¼ö ÀÖÀ» °ÍÀ¸·Î º¸ÀÔ´Ï´Ù.
SHOW INDEX FROM nn.dataset_2day_normalize_60 °á°ú ¿Ã·ÁÁຸ¼¼¿ä