백은빈, 이성욱 님의 "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';
'Database > Mysql' 카테고리의 다른 글
[Real MySQL] 8-9. 인덱스: 유니크 인덱스 (0) | 2024.09.07 |
---|---|
[Real MySQL] 5-2. 트랜잭션과 잠금: 격리 수준 (0) | 2024.08.10 |
[Real MySQL] 15-3. 데이터 타입: 날짜와 시간 (0) | 2023.11.26 |
[Real MySQL] 15-2. 데이터 타입: 숫자 (0) | 2023.11.26 |
[Real MySQL] 15-1. 데이터 타입: 문자열 (0) | 2023.11.26 |