안녕하세요~ 미세먼지때문에 날씨도 흐리흐리한데 다들 건강하시죠?
---------------------------------------------------------------------------------------------------------
다름이 아니라 Maria DB 10.2를 사용중인데 Log성 데이터가 기록되는 한 테이블이 있습니다.
그런데 너무 느려서 따로 인덱스를 잡고 기존 5분이 걸리던걸 5초내에 나왔었는데,
한달지났는데 데이터가 누적되면서 다시 느려져서(20초내외) 문의드립니다.
현재 테이블 구조는 아래와 같습니다.
[테이블구조]
Field | Type | Collation | Null | Key | index(btree) |
사이트 코드 | int(11) | NO | MUL | 1 | |
프로파일 코드 | varchar(20) | utf8_general_ci | YES | 2 | |
프로파일 명 | varchar(300) | utf8_general_ci | YES | ||
결과수신일 | varchar(8) | utf8_general_ci | NO | ||
캠페인 | varchar(300) | utf8_general_ci | YES | ||
국가 | varchar(50) | utf8_general_ci | YES | 3 | |
광고 매체 | varchar(300) | utf8_general_ci | YES | MUL | 4 |
TERM | varchar(1000) | utf8_general_ci | YES | ||
CONTENT | varchar(300) | utf8_general_ci | YES | ||
T1 | decimal(9,0) | YES | |||
....... | decimal(9,0) | YES | |||
..... | decimal(9,0) | YES | |||
T25 | decimal(9,0) | YES | |||
등록일 | datetime | NO | |||
등록자 | varchar(50) | utf8_general_ci | NO |
이 테이블을 조회했을 시
[단순 조회쿼리]
SELECT T1, T2, T3, T4, T5, 사이트 코드, 국가, 프로파일 코드, 광고 매체, 결과수신일
FROM TABLE
속도가 20초 소요(풀 스캔 할 수 밖에 없는 구조)
------------------------------------------------------------------------------------------------------------------------------
[참조]카디널리티
SELECT
COUNT(DISTINCT(사이트_코드)) AS 사이트_코드,
COUNT(DISTINCT(국가)) AS 국가,
COUNT(DISTINCT(프로파일_코드)) AS 프로파일_코드,
COUNT(DISTINCT(광고매체)) AS 광고매체,
COUNT(DISTINCT(결과수신일)) AS 결과수신일
FROM
TABLE;
[결과]
사이트코드 | 국가 | 프로파일_코드 | 광고매체 | 결과수신일 |
28 | 242 | 8 | 13050 | 239 |
------------------------------------------------------------------------------------------------------------------------------
인덱스를 저렇게 잡은 이유는 리포트 쿼리에서
JOIN을 걸떄 사이트코드,국가,프로파일코드,광고매체,결과수신일이 키로 사용되기 때문입니다.
보통 인덱스 생성시 가장 가지수가 많은 것부터 인덱스를 거는 것이 정석으로 알고 있으나,
해당 부분에선 더 느려지더군요..
이와 같을 때 성능 향상을 위해 할 수 있는 방법 이 무엇이 있을까요?
예를 들면 Index를 바꾼다던지 파티셔닝을 이용한다던지 등의 방법...
(정규화가 제대로 되지 않은 DB 구조입니다)
도움 말씀 부탁드리며, 늘 건강하세요.
답변 감사합니다.
해당 테이블은 현재 약 300만건 정도이며 계속 일일 배치를 통해 데이터를 수신해오기 때문에
더욱 늘어날 것으로 추정됩니다.
report에서 사용 되어지는 쿼리이기 때문에 실시간 데이터가 필요하며, 따로 테이블을 구성하려고 해도..
이미 설계 자체가 그런 것을 고려하지 않고 진행 되었기 때문에, 일이 너무 방대해 지지 않을까 노심초사 걱정됩니다.
(실제 운영 중이기 때문에 설계변경은 리스크가 너무 큽니다)
풀스캔 타는데 인덱스를 건 것은 타 테이블과 조인시 인덱스를 안주었을 때는 5분 이상 걸렸으나, 강제 인덱싱을 하고
태우니 3초 밖에 안걸리더라구요..
현재 큰 문제점은 3초면 적당한 수준이나, 시간이 지날수록(데이터 량은 비슷) 느려진다라는 점에 있습니다..
그래서 이런 상황에선 어떤 방안을 가지고 튜닝을 해야할지 궁금했었습니다~
도움 말씀 감사합니다.