Virtual Column (Generated / Computed Column)
Cột “ảo” được tính tự động từ biểu thức trên các cột khác - không tốn dung lượng lưu trữ (dạng VIRTUAL), nhưng đánh index được như cột thường.
Use case 1: Thay functional index trên MariaDB / SQL Server
Hai hệ này không hỗ trợ index trực tiếp trên biểu thức:
-- MariaDB: tạo cột ảo rồi đánh index lên cột đó
CREATE TABLE contacts (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
birthday DATETIME NOT NULL,
birthday_month INT AS (MONTH(birthday)) VIRTUAL NOT NULL,
INDEX contacts_birthmonth (birthday_month)
);Khác biệt quan trọng: SQL Server tự nhận diện biểu thức MONTH(birthday) trong query và ánh xạ tới computed column; MariaDB thì không - query phải dùng đúng tên cột ảo.
Use case 2: Index trường JSON trong MySQL
CREATE TABLE contacts (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
attributes JSON NOT NULL,
-- Cột ảo: tự động tính từ JSON, không tốn dung lượng lưu trữ
email VARCHAR(255) AS (attributes->>"$.email") VIRTUAL NOT NULL,
INDEX contacts_email (email)
);
SELECT * FROM contacts WHERE email = '[email protected]';
-- Hoặc dùng trực tiếp biểu thức JSON (MySQL tự ánh xạ):
SELECT * FROM contacts WHERE attributes->>"$.email" = '[email protected]';Nhược điểm: mỗi trường JSON cần index phải tạo thêm một cột ảo - bảng trở nên rối khi có nhiều trường.
Liên quan
- Functional Index - anh em song sinh (PostgreSQL/MySQL hỗ trợ trực tiếp)
- JSON Indexing và GIN Index - bức tranh đầy đủ về index JSON
- Inequality và Index - cách 3: chuyển inequality thành boolean column