1. What is EXPLAIN?
-
EXPLAIN shows the execution plan for a SELECT (and sometimes DELETE, INSERT, UPDATE) query.
-
It tells you how MySQL will access your tables, whether it uses indexes, how many rows it expects to scan, and in what order.
-
Think of it like an "X-ray" of your query.
2. Basic Syntax
EXPLAIN SELECT * FROM employees WHERE department = 'Sales';
or (from MySQL 8.0+)
EXPLAIN ANALYZE SELECT * FROM employees WHERE department = 'Sales';
3. Important Columns in EXPLAIN Output
Example output (simplified):
| id |
select_type |
table |
type |
possible_keys |
key |
rows |
Extra |
| 1 |
SIMPLE |
employees |
ref |
dept_index |
dept_index |
50 |
Using index condition |
Key columns explained:
-
id → Query step identifier (1 means first, higher values mean subqueries or derived tables).
-
select_type → Type of query (SIMPLE, PRIMARY, SUBQUERY, UNION, etc.).
-
table → Which table is being accessed.
-
type → How rows are accessed (VERY important for performance). Common values:
-
ALL → Full table scan (worst).
-
index → Full index scan.
-
range → Range scan (e.g., BETWEEN, <, >).
-
ref → Lookup using a non-unique index.
-
eq_ref → Lookup using a unique index/primary key.
-
const/system → Single row lookup (best).
-
possible_keys → Indexes that might be used.
-
key → The index actually chosen.
-
rows → Estimated number of rows scanned.
-
Extra → Additional info (e.g., Using where, Using index, Using temporary, Using filesort).
4. Example
Let’s say you have:
CREATE TABLE employees (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100),
department VARCHAR(50),
INDEX (department)
);
EXPLAIN SELECT * FROM employees WHERE department = 'Sales';
Output might be:
| id |
select_type |
table |
type |
possible_keys |
key |
rows |
Extra |
| 1 |
SIMPLE |
employees |
ref |
department |
department |
20 |
Using where |