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';