Cách Lưu Trữ và Truy Vấn JSON Trong MySQL Hiệu Quả

18/04/2026 P T P Chung 7 phút đọc 0 bình luận

Giới thiệu về JSON Data Type trong MySQL

Trong thời đại dữ liệu đa dạng và linh hoạt, JSON (JavaScript Object Notation) đã trở thành một trong những định dạng phổ biến nhất để trao đổi và lưu trữ thông tin. MySQL, từ phiên bản 5.7.8 trở đi, đã chính thức hỗ trợ kiểu dữ liệu JSON, cho phép người dùng lưu trữ và truy vấn dữ liệu JSON một cách bản địa và hiệu quả. Điều này giúp giảm bớt sự phức tạp khi phải tách nhỏ dữ liệu thành nhiều cột hoặc bảng, đồng thời vẫn đảm bảo khả năng tìm kiếm và xử lý nhanh chóng.

Bài viết này sẽ hướng dẫn chi tiết cách sử dụng JSON Data Type trong MySQL, từ cách lưu trữ, truy vấn đến tối ưu hiệu năng.

Lưu trữ dữ liệu JSON trong MySQL

Tạo bảng với cột JSON

Để lưu trữ dữ liệu JSON, bạn chỉ cần khai báo kiểu dữ liệu cho cột là JSON. MySQL sẽ tự động kiểm tra tính hợp lệ của dữ liệu JSON khi insert hoặc update.

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100),
    profile JSON
);

Insert dữ liệu JSON

Bạn có thể insert dữ liệu JSON dưới dạng chuỗi hoặc sử dụng hàm JSON_OBJECT để xây dựng đối tượng JSON một cách an toàn.

INSERT INTO users (name, profile)
VALUES
('John Doe', '{"age": 30, "city": "New York", "skills": ["SQL", "Python"]}'),
('Jane Smith', JSON_OBJECT('age', 25, 'city', 'San Francisco', 'skills', JSON_ARRAY('JavaScript', 'React')));

Kiểm tra và validate JSON

MySQL sẽ tự động validate dữ liệu JSON khi insert hoặc update. Nếu dữ liệu không hợp lệ, lệnh sẽ bị từ chối.

INSERT INTO users (name, profile)
VALUES ('Invalid User', '{age: 20}'); -- Lỗi: JSON không hợp lệ

Truy vấn dữ liệu JSON

Lấy toàn bộ dữ liệu JSON

Để lấy toàn bộ nội dung JSON từ một cột, bạn chỉ cần chọn cột đó như bình thường.

SELECT name, profile FROM users;

Trích xuất giá trị từ JSON

MySQL cung cấp các hàm để trích xuất giá trị từ JSON, ví dụ như JSON_EXTRACT (hoặc toán tử ->) và JSON_UNQUOTE (hoặc toán tử ->>).

SELECT 
    name,
    JSON_EXTRACT(profile, '$.age') AS age,
    profile->'$.city' AS city, -- tương đương JSON_EXTRACT
    profile->>'$.city' AS city_unquoted; -- trích xuất và bỏ dấu ngoặc kép

Tìm kiếm trong JSON

Bạn có thể sử dụng các hàm JSON trong mệnh đề WHERE để lọc dữ liệu.

SELECT name, profile
FROM users
WHERE JSON_EXTRACT(profile, '$.age') = 30;

Hoặc sử dụng toán tử ->> để so sánh trực tiếp:

Quảng cáo

300x250 In-Content Advertisement

SELECT name, profile
FROM users
WHERE profile->>'$.city' = 'New York';

Cập nhật dữ liệu JSON

Để cập nhật một phần tử trong JSON, sử dụng hàm JSON_SET, JSON_REPLACE, hoặc JSON_REMOVE.

UPDATE users
SET profile = JSON_SET(profile, '$.city', 'Los Angeles', '$.age', 31)
WHERE id = 1;

Thêm phần tử vào JSON

UPDATE users
SET profile = JSON_INSERT(profile, '$.country', 'USA')
WHERE id = 1;

Tối ưu hiệu năng khi làm việc với JSON

Sử dụng Virtual Columns (Generated Columns)

Để tăng tốc độ truy vấn, bạn có thể tạo virtual columns trích xuất từ JSON và đặt index cho chúng.

ALTER TABLE users
ADD COLUMN age INT GENERATED ALWAYS AS (profile->>'$.age') STORED,
ADD INDEX idx_age (age);

Tạo Functional Index

MySQL 8.0.21+ hỗ trợ functional index, cho phép đặt index trực tiếp trên biểu thức JSON.

CREATE INDEX idx_city ON users ((profile->>'$.city'));

Hạn chế kích thước JSON

Mặc dù MySQL cho phép lưu trữ JSON lớn, nhưng nên hạn chế kích thước để tránh ảnh hưởng hiệu năng. Nếu JSON quá phức tạp, hãy cân nhắc chuẩn hóa dữ liệu vào các bảng riêng.

Kết luận

JSON Data Type trong MySQL mang lại sự linh hoạt và tiện lợi khi làm việc với dữ liệu bán cấu trúc. Tuy nhiên, để đạt hiệu năng tốt nhất, cần kết hợp các kỹ thuật như virtual columns, indexing và validation. Việc nắm vững các hàm JSON và áp dụng chúng một cách hợp lý sẽ giúp ứng dụng của bạn vừa mạnh mẽ vừa dễ bảo trì.

Hy vọng bài viết này đã cung cấp cho bạn cái nhìn tổng quan và thực tế về cách lưu trữ và truy vấn JSON trong MySQL. Hãy thử nghiệm và tối ưu theo nhu cầu cụ thể của dự án!

Quảng cáo

728x90 Bottom Advertisement

Thay thế bằng mã Google AdSense

Chia sẻ bài viết

Facebook Twitter

Bình luận

Chia sẻ ý kiến của bạn về bài viết này

Viết bình luận

Bình luận của bạn sẽ được kiểm duyệt trước khi hiển thị

Chưa có bình luận nào

Hãy là người đầu tiên bình luận về bài viết này!