반응형
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
반응형
'DB' 카테고리의 다른 글
| [MySQL] JSON_EXTRACT와 -> 연산자로 값 조회하기 (2) | 2025.07.28 |
|---|---|
| [MySQL] JSON_OBJECT, JSON_ARRAY로 JSON 생성하기 (1) | 2025.07.28 |
| [MySQL] JSON 데이터 타입과 기본 구조 이해하기 (1) | 2025.07.28 |
| [MySQL] 암호화와 해시 함수 선택 가이드 (1) | 2025.07.28 |
| [MySQL] ENCODE와 DECODE 함수 사용법 🔐 (1) | 2025.07.28 |
| [MySQL] AES_ENCRYPT, AES_DECRYPT로 대칭키 암호화 🔐 (0) | 2025.07.25 |
| [MySQL] MD5와 SHA 해시 함수 비교와 실전 활용 (1) | 2025.07.25 |
| [MySQL] PASSWORD와 OLD_PASSWORD 함수 완전 해부 (0) | 2025.07.25 |