Tại sao MySQL Indexing lại quan trọng?
Khi làm việc với cơ sở dữ liệu, tốc độ truy vấn là yếu tố then chốt quyết định hiệu năng của ứng dụng. Một truy vấn đơn giản có thể mất vài mili giây hoặc vài giây, thậm chí vài phút tùy thuộc vào cách dữ liệu được tổ chức và truy cập. Đó là lý do MySQL Indexing (chỉ mục) ra đời – giúp tăng tốc độ tìm kiếm, sắp xếp và truy xuất dữ liệu một cách đáng kể.
Chỉ mục (Index) là gì?
Chỉ mục trong MySQL là một cấu trúc dữ liệu phụ, được xây dựng trên một hoặc nhiều cột của bảng. Nó hoạt động giống như “mục lục” trong một cuốn sách, cho phép MySQL nhanh chóng xác định vị trí của dữ liệu mà không cần quét toàn bộ bảng. Thay vì duyệt từng hàng, MySQL sẽ sử dụng cây B-tree (hoặc các cấu trúc khác) để tìm kiếm nhanh chóng.
Các loại Index phổ biến trong MySQL
1. Primary Key (Khóa chính)
– Đảm bảo tính duy nhất và không thể null.
– Tự động tạo chỉ mục clustered (đối với InnoDB).
– Ví dụ: id INT PRIMARY KEY
2. Unique Index (Chỉ mục duy nhất)
– Đảm bảo giá trị trong cột là duy nhất.
– Không tự động tạo nếu đã có Primary Key.
– Ví dụ: UNIQUE INDEX idx_email (email)
3. Index thường (Normal Index)
– Tăng tốc độ tìm kiếm, sắp xếp trên một hoặc nhiều cột.
– Không ràng buộc tính duy nhất.
– Ví dụ: INDEX idx_name (last_name, first_name)
4. Full-text Index
– Dùng cho tìm kiếm văn bản toàn phần.
– Chỉ hỗ trợ MyISAM và InnoDB (MySQL 5.6+).
– Ví dụ: FULLTEXT INDEX idx_content (content)
5. Spatial Index
– Dùng cho dữ liệu không gian (tọa độ, hình học).
– Ví dụ: SPATIAL INDEX idx_location (location)
Cách tạo Index hiệu quả
Nguyên tắc chọn cột để index
– Cột thường xuyên dùng trong WHERE, JOIN, ORDER BY, GROUP BY.
– Cột có tính chọn lọc cao (nhiều giá trị khác nhau).
– Tránh index trên cột có tỷ lệ trùng lặp cao (ví dụ: giới tính).
Ví dụ tạo Index
-- Index đơn trên một cột
CREATE INDEX idx_age ON users(age);
-- Index composite trên nhiều cột
CREATE INDEX idx_name_age ON users(last_name, age);
-- Index trên bảng đã tồn tại
ALTER TABLE users ADD INDEX idx_email (email);
Chiến lược sử dụng Index
1. Index theo thứ tự truy vấn
Nếu truy vấn có WHERE a = ? AND b = ?, hãy tạo index theo thứ tự (a, b).
2. Index phủ (Covering Index)
Index chứa tất cả các cột cần truy vấn, MySQL không cần quay lại bảng dữ liệu.
-- Index phủ cho truy vấn SELECT name, age FROM users WHERE age > 20
CREATE INDEX idx_name_age ON users(name, age);