EXPLAIN là công cụ chẩn đoán hiệu năng quan trọng nhất trong MySQL. Nó hiển thị **kế hoạch thực thi (execution plan)** – cách MySQL dự định truy cập dữ liệu: dùng index nào, quét bao nhiêu hàng, join theo thứ tự nào, v.v.
Cú pháp
EXPLAIN SELECT ... FROM ... WHERE ...;
Hỗ trợ: SELECT, INSERT, UPDATE, DELETE, REPLACE.
Ví dụ minh họa
Tạo bảng sinh viên và index trên StudentId:
mysql> CREATE TABLE DemoTable1488 (
-> StudentId INT,
-> StudentName VARCHAR(20),
-> StudentAge INT
-> );
mysql> CREATE INDEX student_id_index ON DemoTable1488(StudentId);
Chèn dữ liệu:
mysql> INSERT INTO DemoTable1488 VALUES
-> (101, 'Sam', 21),
-> (102, 'Bob', 23),
-> (103, 'David', 20);
Chạy EXPLAIN cho truy vấn tìm ID = 1:
mysql> EXPLAIN SELECT * FROM DemoTable1488 WHERE StudentId = 1;
Kết quả (đã rút gọn các cột quan trọng):
+----+-------------+---------------+------+------------------+------------------+---------+-------+------+----------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+---------------+------+------------------+------------------+---------+-------+------+----------+-------+ | 1 | SIMPLE | DemoTable1488 | ref | student_id_index | student_id_index | 5 | const | 1 | 100.00 | NULL | +----+-------------+---------------+------+------------------+------------------+---------+-------+------+----------+-------+
Giải thích các cột quan trọng
| Cột | Ý nghĩa | Tốt | Xấu |
|---|---|---|---|
| type | Loại truy cập | const, eq_ref, ref, range | ALL (full table scan), index |
| possible_keys | Index có thể dùng | Có tên index | NULL |
| key | Index thực sự dùng | Tên index | NULL |
| rows | Ước lượng hàng quét | Nhỏ (1, 10, 100) | Lớn (gần tổng số hàng) |
| Extra | Thông tin thêm | Using index, Using where | Using filesort, Using temporary |
Trong ví dụ: type=ref, key=student_id_index, rows=1 → **rất tốt**, dùng index tìm chính xác 1 hàng.
EXPLAIN ANALYZE (MySQL 8.0.18+)
Thêm ANALYZE để chạy thật và đo thời gian thực:
EXPLAIN ANALYZE SELECT * FROM DemoTable1488 WHERE StudentId = 1;
Sẽ hiển thị actual time, actual rows, loops – chính xác hơn ước lượng.