EXPLAIN describes how a database plans to execute a query.
The examples focus on the operation itself, including the important distinction: An index can reduce scans; EXPLAIN helps identify when it will be used.
What It Does
Use the examples below to observe the behavior on a small dataset before extending it to application code.
Before You Start
The examples use PHP 8.2+ features where shown. Database snippets require the corresponding PDO driver, demo tables, and credentials configured outside source code.
Example 1: Basic Use
Study estimated rows and chosen indexes; EXPLAIN is a plan estimate rather than a stopwatch.
<?php
$pdo = new PDO(
"mysql:host=" . (getenv("DB_HOST") ?: "127.0.0.1") . ";dbname=" . (getenv("DB_NAME") ?: "demo") . ";charset=utf8mb4",
getenv("DB_USER") ?: "app",
getenv("DB_PASSWORD") ?: "",
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => false]
);
$stmt = $pdo->prepare("EXPLAIN SELECT id, email FROM users WHERE active = ? ORDER BY id LIMIT 20");
$stmt->execute([1]);
foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $plan) {
echo ($plan["type"] ?? "?") . " / " . ($plan["key"] ?? "no index") . PHP_EOL;
}
This example is meant for a configured application environment; output depends on the installed extension, external service, or database contents.
Example 2: Checking Behavior
Study estimated rows and chosen indexes; EXPLAIN is a plan estimate rather than a stopwatch. Different sort directions and keys may produce different index plans.
<?php
$pdo = new PDO(
"mysql:host=" . (getenv("DB_HOST") ?: "127.0.0.1") . ";dbname=" . (getenv("DB_NAME") ?: "demo") . ";charset=utf8mb4",
getenv("DB_USER") ?: "app",
getenv("DB_PASSWORD") ?: "",
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => false]
);
$stmt = $pdo->prepare("EXPLAIN SELECT id, email FROM users WHERE active = ? ORDER BY email LIMIT 20");
$stmt->execute([1]);
foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $plan) {
echo ($plan["type"] ?? "?") . " / " . ($plan["key"] ?? "no index") . PHP_EOL;
}
This example is meant for a configured application environment; output depends on the installed extension, external service, or database contents.
Example 3: Practical Example
Study estimated rows and chosen indexes; EXPLAIN is a plan estimate rather than a stopwatch. Different sort directions and keys may produce different index plans.
<?php
$pdo = new PDO(
"mysql:host=" . (getenv("DB_HOST") ?: "127.0.0.1") . ";dbname=" . (getenv("DB_NAME") ?: "demo") . ";charset=utf8mb4",
getenv("DB_USER") ?: "app",
getenv("DB_PASSWORD") ?: "",
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => false]
);
$stmt = $pdo->prepare("EXPLAIN SELECT id, email FROM users WHERE active = ? ORDER BY id DESC LIMIT 40");
$stmt->execute([1]);
foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $plan) {
echo ($plan["type"] ?? "?") . " / " . ($plan["key"] ?? "no index") . PHP_EOL;
}
This example is meant for a configured application environment; output depends on the installed extension, external service, or database contents.
Important Behavior and Edge Cases
The plan depends on indexes, table statistics, parameters and server version; benchmark before and after changes.
Comparison with Related Approaches
| Approach | Difference |
|---|---|
| Optimizing a Slow PDO Query with EXPLAIN | EXPLAIN describes how a database plans to execute a query. |
| Related API or alternative | An index can reduce scans; EXPLAIN helps identify when it will be used. |
Common Beginner Mistakes
| Mistake | Correct approach |
|---|---|
| Ignoring the operation-specific limits | The plan depends on indexes, table statistics, parameters and server version; benchmark before and after changes. |
| Confusing it with a related API | An index can reduce scans; EXPLAIN helps identify when it will be used. |
Key Takeaways
- EXPLAIN describes how a database plans to execute a query.
- The plan depends on indexes, table statistics, parameters and server version; benchmark before and after changes.
- An index can reduce scans; EXPLAIN helps identify when it will be used.
Use Optimizing a Slow PDO Query with EXPLAIN when its documented behavior matches the problem. Test the relevant edge cases in your own runtime before deploying it.