DB

[MySQL] COMPRESS와 UNCOMPRESS로 데이터 압축 처리하기

인생아 2025. 7. 28. 11:42
반응형

MySQL은 COMPRESS()와 UNCOMPRESS() 함수를 통해 데이터를 압축하여 저장하거나 복원하는 기능을 지원한다. 이 기능은 대용량 텍스트나 바이너리 데이터를 공간 절약의 목적으로 저장할 때 유용하다. 특히 로그, 메모, 파일 데이터처럼 용량이 큰 필드에서 실무적으로 활용할 수 있다.

1. COMPRESS 함수란?

SELECT TO_BASE64(COMPRESS('압축할 텍스트 데이터'));
  • 입력된 문자열을 zlib 라이브러리를 기반으로 압축한다.
  • 결과는 바이너리(BLOB)로 반환되므로, 사람이 읽기 어렵다.
  • 이를 저장하거나 조회 시에는 BASE64로 인코딩하는 것이 일반적이다.

압축 결과 예시

SELECT LENGTH('압축할 데이터'), LENGTH(COMPRESS('압축할 데이터'));
  • 원래 데이터가 클수록 압축 효과가 커진다.
  • 짧은 문자열은 오히려 길어질 수도 있다.
반응형

2. UNCOMPRESS 함수란?

SET @compressed = TO_BASE64(COMPRESS('MySQL 데이터 압축'));
SELECT UNCOMPRESS(FROM_BASE64(@compressed));
-- 결과: MySQL 데이터 압축
  • COMPRESS()로 압축된 데이터를 복원
  • 원래의 문자열로 되돌릴 수 있다.
  • FROM_BASE64()로 디코딩한 뒤 UNCOMPRESS() 적용

복원 예제

SET @compressed = TO_BASE64(COMPRESS('MySQL 데이터 압축'));
SELECT UNCOMPRESS(FROM_BASE64(@compressed));
-- 결과: MySQL 데이터 압축

3. 실무 활용 예시

대용량 로그 저장

INSERT INTO log_data (created_at, log_blob)
VALUES (NOW(), COMPRESS('에러 메시지와 긴 로그 정보...'));

압축된 로그 복원

SELECT created_at, UNCOMPRESS(log_blob) AS log_text
FROM log_data;
  • log_blob 컬럼 타입은 BLOB 또는 MEDIUMBLOB 권장
  • 압축 비율이 높을수록 저장 공간이 줄어든다.
반응형

4. 압축 효과 테스트

SELECT 
  LENGTH(REPEAT('1234567890', 1000)) AS 원본길이,
  LENGTH(COMPRESS(REPEAT('1234567890', 1000))) AS 압축길이;
  • 반복 문자열이나 유사 패턴이 많을수록 압축률은 크게 증가한다.
  • 일반 텍스트는 보통 50~80% 수준까지 줄어든다.

5. 주의사항

항목 내용
문자셋 호환 압축 결과는 바이너리이므로 인코딩 깨짐에 유의
검색 불가 압축된 데이터는 LIKE, FULLTEXT 등 검색이 불가능
짧은 데이터 비효율 압축 오버헤드 때문에 짧은 데이터는 오히려 비효율
읽기 성능 영향 매번 UNCOMPRESS 할 경우 쿼리 성능에 부담

🔍 즉시 조회가 잦은 필드에는 사용하지 않는 것이 좋다. 로그나 보관성 데이터에 적합하다.

6. COMPRESS vs AES_ENCRYPT 차이

항목 COMPRESS AES_ENCRYPT
목적 용량 축소 데이터 보안
복호화 여부 O (UNCOMPRESS) O (AES_DECRYPT)
암호화 기능 X O
사용 사례 로그, 대용량 데이터 개인정보, 인증 정보 등

참고 문서

https://dev.mysql.com/doc/refman/8.0/en/encryption-functions.html#function_compress
https://dev.mysql.com/doc/refman/8.0/en/encryption-functions.html#function_uncompress

 

반응형