1. Giới thiệu
1.1 Tầm quan trọng của JSON
Trong phát triển web hiện đại, việc trao đổi dữ liệu ngày càng trở nên phức tạp. JSON (JavaScript Object Notation) là một định dạng dữ liệu nhẹ và có cấu trúc, được sử dụng rộng rãi để truyền tải và lưu trữ dữ liệu. Từ phiên bản 5.7, MySQL đã hỗ trợ kiểu dữ liệu JSON, giúp việc thao tác với dữ liệu JSON trong cơ sở dữ liệu trở nên dễ dàng hơn.
1.2 Sử dụng JSON trong MySQL
Bài viết này sẽ giải thích chi tiết từ các thao tác cơ bản với JSON trong MySQL, đến các vấn đề liên quan đến hiệu năng và cách ứng dụng thực tế. Nội dung phù hợp cho cả người mới bắt đầu lẫn chuyên gia, cung cấp kiến thức để sử dụng JSON trong MySQL một cách hiệu quả.
2. JSON trong MySQL là gì
2.1 Cơ bản về JSON
JSON là một định dạng đơn giản để cấu trúc dữ liệu dưới dạng cặp khóa-giá trị. Nó được sử dụng rộng rãi trong API web và truyền tải dữ liệu nhờ tính nhẹ và dễ đọc. Trong MySQL, sử dụng kiểu dữ liệu JSON cho phép lưu trữ và thao tác trực tiếp với dữ liệu JSON trong cơ sở dữ liệu.
2.2 Kiểu dữ liệu JSON trong MySQL
Kiểu dữ liệu JSON được giới thiệu từ MySQL 5.7, yêu cầu dung lượng đĩa tương tự như LONGBLOB hoặc LONGTEXT. Để đảm bảo tính toàn vẹn của dữ liệu, MySQL sẽ kiểm tra hợp lệ JSON khi chèn dữ liệu, giúp ngăn ngừa việc chèn dữ liệu JSON không đúng định dạng.
2.3 Các trường hợp sử dụng JSON
Một số tình huống phổ biến khi sử dụng JSON trong MySQL bao gồm:
- Lưu trữ cấu trúc dữ liệu phức tạp
- Lưu trữ dữ liệu lấy trực tiếp từ API
- Quản lý dữ liệu có schema thay đổi

3. Các thao tác cơ bản với JSON trong MySQL
3.1 Tạo cột JSON
Để tạo một cột lưu trữ dữ liệu JSON, sử dụng cú pháp sau với kiểu dữ liệu json
:
CREATE TABLE json_data (
doc JSON
);
3.2 Chèn dữ liệu JSON
Để chèn dữ liệu JSON, sử dụng câu lệnh INSERT
như sau. MySQL sẽ kiểm tra định dạng JSON, nếu dữ liệu không hợp lệ sẽ báo lỗi:
INSERT INTO json_data(doc) VALUES ('{"a": {"b": ["c", "d"]}, "e": "f"}');
Bạn cũng có thể sử dụng hàm JSON_OBJECT
để tạo đối tượng JSON từ cặp khóa-giá trị:
INSERT INTO json_data(doc) VALUES (JSON_OBJECT('key1', 'value1', 'key2', 'value2'));
3.3 Truy vấn dữ liệu JSON
Để truy vấn dữ liệu JSON đã chèn, sử dụng hàm JSON_EXTRACT
để lấy dữ liệu theo đường dẫn:
SELECT * FROM json_data WHERE JSON_EXTRACT(doc, '$.e') = 'f';
Ngoài ra có thể dùng toán tử rút gọn ->
:
SELECT * FROM json_data WHERE doc->'$.e' = 'f';
3.4 Cập nhật dữ liệu JSON
Để cập nhật một phần dữ liệu JSON, sử dụng hàm JSON_SET
để thay đổi giá trị tại một đường dẫn cụ thể:
UPDATE json_data SET doc = JSON_SET(doc, '$.a.b[0]', 'new_value');
4. Các yếu tố liên quan đến hiệu năng
4.1 Hiệu năng khi chèn dữ liệu
Khi chèn dữ liệu vào cột JSON, hiệu năng gần như tương đương với kiểu TEXT
. Thử nghiệm với 50,000 bản ghi cho thấy thời gian chèn dữ liệu của kiểu JSON tương đương với TEXT.
4.2 Hiệu năng khi cập nhật
Với JSON_SET
, có thể cập nhật một phần dữ liệu thay vì ghi đè toàn bộ, giúp cải thiện hiệu năng đáng kể ngay cả khi cập nhật hàng chục nghìn bản ghi.

5. Best Practices khi dùng JSON trong MySQL
5.1 Khi nào nên dùng JSON
JSON thích hợp cho dữ liệu phức tạp hoặc dữ liệu có schema thay đổi. Tuy nhiên, với dữ liệu có cấu trúc rõ ràng, nên dùng bảng quan hệ để đạt hiệu quả cao hơn.
5.2 Tạo index cho dữ liệu JSON
Trong MySQL, có thể dùng cột ảo (Virtual Column) để tạo index cho dữ liệu JSON, giúp cải thiện hiệu năng truy vấn:
ALTER TABLE json_data ADD COLUMN e_value VARCHAR(255) AS (doc->'$.e'), ADD INDEX (e_value);
5.3 Tránh các sai lầm thường gặp
- Không lạm dụng JSON, tận dụng lợi thế của cơ sở dữ liệu quan hệ.
- Tạo index hợp lý để tối ưu truy vấn.
- Tránh lưu trữ JSON quá lớn, cân nhắc chuẩn hóa dữ liệu khi cần.
6. Các hàm JSON nâng cao trong MySQL
6.1 Các hàm JSON khác
MySQL cung cấp nhiều hàm để thao tác với JSON, ví dụ: JSON_APPEND
để thêm dữ liệu vào cuối, hoặc JSON_REMOVE
để xóa một trường cụ thể:
-- Thêm dữ liệu
UPDATE json_data SET doc = JSON_APPEND(doc, '$.a.b', 'new_element');
-- Xóa dữ liệu
UPDATE json_data SET doc = JSON_REMOVE(doc, '$.a.b[0]');
6.2 Kết hợp với các hàm SQL khác
Các hàm JSON có thể kết hợp với các hàm SQL truyền thống để tạo truy vấn phức tạp, ví dụ sử dụng với GROUP BY
hoặc ORDER BY
:
SELECT JSON_EXTRACT(doc, '$.e') AS e_value, COUNT(*) FROM json_data GROUP BY e_value;
7. Kết luận
Bài viết đã giải thích chi tiết từ thao tác cơ bản đến nâng cao với JSON trong MySQL. Bằng cách tận dụng các tính năng của JSON, bạn có thể dễ dàng lưu trữ và quản lý dữ liệu phức tạp trong cơ sở dữ liệu. Hãy áp dụng các best practices và tối ưu hiệu năng để quản lý dữ liệu hiệu quả hơn.