Database/Mysql

[Real MySQL] 15-4. 데이터 타입: JSON

noahkim_ 2023. 11. 26. 16:32

백은빈, 이성욱 님의 "Real MySQL" 책을 정리한 포스팅 입니다.

 

1. JSON

이진 형태

  • 일반적인 문자열 저장 방식보다 빠른 검색 및 업데이트 가능

 

BSON (Binary JSON)
  • NoSQL에서 사용하는 JSON의 바이너리 표현
  • 내부적으로 JSON 데이터를 BSON 형식으로 변환하여 읽고 씀

 

BLOB
  • 데이터가 작을 경우, 하나의 페이지에 저장됨
  • 데이터가 클 경우, 여러 페이지로 나뉘어 저장됨 (최대 4GB까지)

 

구조

JSON 정보
  • JSON 타입, 애트리뷰트 수, 총 데이터 길이

 

Key - Value
  • 주소(offset), 길이, 값, (타입)

 

2. 명령어

생성

CREATE TABLE employees (
    id INT AUTO_INCREMENT PRIMARY KEY,
    info JSON NOT NULL
);

 

삽입

INSERT INTO employees (info) VALUES
('{"name": "Alice", "age": 30, "skills": ["Java", "SQL"]}'),
('{"name": "Bob", "age": 25, "skills": ["Python", "Django"]}');

 

조회

SELECT 
    JSON_EXTRACT(info, '$.name') AS name,
    JSON_EXTRACT(info, '$.skills[0]') AS first_skill
FROM employees;

 

모든 Key 가져오기
SELECT JSON_KEYS(info) FROM employees;

 

배열 길이 확인
SELECT 
    JSON_EXTRACT(info, '$.name') AS name,
    JSON_LENGTH(JSON_EXTRACT(info, '$.skills[0]')) AS first_skill_length
FROM employees;

 

조건
SELECT 
    JSON_EXTRACT(info, '$.name') AS name,
    JSON_EXTRACT(info, '$.skills[0]') AS first_skill
FROM employees
WHERE JSON_CONTAINS(info, '"Java"', '$.skills');

 

갱신

  • JSON 필드 전체를 재저장하지 않고, 특정 필드만 수정할 수 있는 기능 제공 (다른 RDBMS는 전체 JSON을 다시 저장해야 함)
  • 최초 할당됬던 공간 활용
  • 매우 빠른 업데이트 성능
UPDATE example
SET data = JSON_SET(data, '$.age', 31)
WHERE id = 1;

 

제거

필드 제거
UPDATE example
SET data = JSON_REMOVE(data, '$.skills')
WHERE id = 1;

 

레코드 제거
DELETE FROM employees WHERE JSON_EXTRACT(info, '$.name') = 'Bob';