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