Khi nào nên tạo index trên cột INT trong MySQL?
Tạo index trên cột kiểu INT giúp tăng tốc truy vấn đáng kể khi bảng có nhiều dữ liệu, nhưng có chi phí khi INSERT/UPDATE/DELETE.
Quy tắc chung
- Bảng lớn (> 10k rows): Index INT rất hiệu quả
- Bảng nhỏ (< 1k rows): Full table scan nhanh hơn, index là thừa
- Cột dùng trong WHERE, JOIN, ORDER BY: Nên index
- Cột ít giá trị distinct (low cardinality): Index kém hiệu quả (ví dụ: gender, status boolean)
Ví dụ tạo bảng có index INT
mysql> CREATE TABLE indexOnIntColumnDemo (
-> UserId INT,
-> UserName VARCHAR(20),
-> UserAge INT,
-> INDEX(UserId)
-> );
Kiểm tra cấu trúc:
mysql> DESC indexOnIntColumnDemo; +----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+-------+ | UserId | int(11) | YES | MUL | NULL | | | UserName | varchar(20) | YES | | NULL | | | UserAge | int(11) | YES | | NULL | | +----------+-------------+------+-----+---------+-------+
Key = MUL cho thấy UserId có index (non-unique)
Chèn dữ liệu và truy vấn
mysql> INSERT INTO indexOnIntColumnDemo VALUES (1001, 'John', 23), (1002, 'Sam', 25), (1003, 'Carol', 22), (1004, 'Mike', 26); mysql> SELECT * FROM indexOnIntColumnDemo WHERE UserId = 1004;
Kết quả:
+--------+----------+---------+ | UserId | UserName | UserAge | +--------+----------+---------+ | 1004 | Mike | 26 | +--------+----------+---------+
Kiểm tra index có được dùng không
mysql> EXPLAIN SELECT * FROM indexOnIntColumnDemo WHERE UserId = 1004; +----+-------------+----------------------+-------+---------------+----------+---------+-------+------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+----------------------+-------+---------------+----------+---------+-------+------+-------+ | 1 | SIMPLE | indexOnIntColumnDemo | ref | UserId | UserId | 5 | const | 1 | | +----+-------------+----------------------+-------+---------------+----------+---------+-------+------+-------+
type = ref và key = UserId → Index được sử dụng!
Lưu ý
- Primary Key tự động là index duy nhất (UNIQUE)
- Index INT chiếm ít bộ nhớ hơn VARCHAR
- Composite index: (UserId, UserAge) cho query WHERE UserId=... AND UserAge=...