본문 바로가기

SWUFORCE 기술스터디 📝

[KakaoTech] MySQL Json 데이터 타입의 저장 구조와 성능 비교

시작하며

JSON 데이터 타입을 보고, JSON 데이터를 저장할 때 JSON, TEXT 데이터 타입 중 어떤 데이터 타입을 사용하는 것이 더 성능에 유리한 지 알아보려고 한다.

 

JSON 데이터 타입 저장 방식

MySQL에서 JSON 데이터 타입 컬럼을 설정해 데이터를 사용할 때, '직렬화'와 '역직렬화'. 이 두가지 변환 작업 과정이 진행된다.

 

hexdump를 통해 저장된 정보를 분석해보면 TEXT 데이터 타입은 JSON 포맷의 문자열을 입력 받은 문자열 그대로 저장한다.

 

직렬화 : JSON 데이터 타입 저장 시 클라이언트로부터 받은 문자열을 문자열 그대로 저장하지 않고, 일련의 변환과정을 거쳐 정해진 형식에 맞게 저장하는 과정을 말한다.

역직렬화 : ibd 파일에 저장된 데이터를 추출하여 JSON 오브젝트로 구성하고 클라이언트로 전달하는 과정을 말한다.

 

 

1. 문자열을 파싱하여 JSON 인스턴스 생성

JSON 데이터를 저장할 때 먼저 sql_common/json_dom.h에 정의된 JSON 객체를 사용하여 해당 데이터를 저장할 인스턴스를 생성한다. json_dom.h에 JSON 객체는 다음과 같이 정의되어 있다.

입력 받는 JSON 데이터는 구조의 특성에 따라 json_dom 클래스를 상속 받아 서브 클래스들을 통해 구현한다. Json_object 와 Json_array의 구현을 살펴보면, 특성에 맞는 자료구조를 활용하여 구현 되었음을 알 수 있다.

 

 

1.1. 직렬화 작업

클라이언트가 전달한 문자열은 여러개의 함수를 순차적으로 거친다.

 

1.2. TEXT 데이터 타입과 입력 처리 

직렬화 과정과 비교해서 매우 간단하다. 그림을 보면 알 수 있듯이, JSON 데이터 타입에 데이터를 저장하는 과정에는 직렬화와 유효성 확인과 같은 추가 작업이 포함되어 있다. 이 과정의 차이가 JSON 데이터 타입과 TEXT 데이터 타입 간의 성능차이의 주요 요소가 된다.

 

 

2. 데이터 타입에 따른 저장 크기 비교

동일한 JSON 데이터를 입력할 때 각 타입별로 어느정도 공간이 필요한 지 알아보겠다. 또한, JSON 데이터를 JSON 데이터 타입의 컬럼에 저장했을 때와 TEXT 데이터 타입의 컬럼에 저장했을 때 저장 공간 사이즈가 어느 정도 차이가 나는지 확인해 보도록 하겠다.

hexdump를 통해 실제 데이터가 저장된 영역을 살펴보면, 실제 데이터를 저장할 때 여러 메타 정보를 함께 저장하는 JSON 데이터 타입이 상대적으로 더 많은 공간을 사용하는 것을 확인할 수 있다.

 

 

3. JSON 데이터 추출하기

JSON 데이터를 JSON 데이터 타입에 저장하면, 내부적으로 직렬화 과정을 거치지 때문에 TEXT 데이터 타입에 저장한 경우와 다르게 시간 소요도 더 걸리고 저장 공간이 더 필요함을 확인할 수 있었다. 이제는 저장된 데이터를 추출할 때 두 데이터 타입에 따라 어떻게 동작 방식이 다른지 확인해 보도록 하자.

 

 

JSON 데이터 타입에 저장된 JSON 값은 왼쪽 그림과 같은 과정을 거쳐 클라이언트에게 전달된다. 

(그림에 표현된 작업 단계를 거쳐 저장된 데이터를 JSON 객체로 만들고, 그 객체를 기반으로 문자열을 만들어서 클라이언트에 전달한다.)

TEXT 데이터 타입은 오른쪽 그림처럼 변환 작업 없이 추출하여 클라이언트에 전달한다.

 

 

4. JSON / TEXT 데이터 타입에 따른 성능 비교

어떤 데이터 타입의 컬럼을 선택하느냐에 따라 어떤 성능 차이가 있는지도 알아보자.

 

4.1. TEXT 데이터 타입을 사용해야 하는 경우

JSON 데이터를 저장하고, JSON 전체를 추출하는 등 단순 저장 및 읽기용으로 사용하는 경우에는 TEXT 데이터 타입이 성능적으로 더 유리하다. TEXT 데이터 타입을 사용하게 되면 저장/추출 시에 직렬화/역직렬화 작업을 수행하지 않으므로 더 빠른 시간에 쿼리 수행을 완료할 수 있다. 

 

4.2. JSON 데이터 타입을 사용해야 하는 경우

JSON 데이터를 저장/추출만 하는게 아니라, 여러 JSON 함수를 사용하여 가공 처리하는 경우에는 JSON 데이터 타입을 사용하는 것이 성능 상 더 유리하다. 특 히, key를 사용하여 데이터를 추출하는 경우에는 전체 JSON 데이터를 추출하는 것보다 훨씬 더 좋은 성능을 보여준다는 것을 확인할 수 있다.

 

 

마무리하며

어떤 상황에서나 적용되는 완벽한 '정답’은 없지만, 기술적 원리를 이해한다면 분명 '최선의 선택’은 할 수 있다. MySQL에서 JSON 데이터를 어떻게 다루어야 할지 고민이 되면, 이 글을 참고하길 바란다.

 

 

 

[출처] 

https://tech.kakao.com/posts/774 [Kakao tech] MySQL Json 데이터 타입의 저장 구조와 성능 비교