-- PostgreSQLEXPLAIN SELECT * FROM employees WHERE dept_id = 5;EXPLAIN ANALYZE SELECT * FROM employees WHERE dept_id = 5; -- 实际执行-- MySQLEXPLAIN SELECT * FROM employees WHERE dept_id = 5;EXPLAIN ANALYZE SELECT * FROM employees WHERE dept_id = 5; -- MySQL 8.0+-- SQL ServerSET SHOWPLAN_TEXT ON;SELECT * FROM employees WHERE dept_id = 5;-- OracleEXPLAIN PLAN FOR SELECT * FROM employees WHERE dept_id = 5;SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
-- 顺序扫描(Seq Scan):全表扫描Seq Scan on employees-- 适合:小表、大部分行需要返回-- 索引扫描(Index Scan):使用B+树索引Index Scan using idx_employees_dept on employees-- 适合:选择性高的查询-- 仅索引扫描(Index Only Scan):覆盖索引Index Only Scan using idx_employees_dept_name on employees-- 适合:索引包含所有需要的列-- 位图扫描(Bitmap Heap Scan + Bitmap Index Scan)Bitmap Heap Scan on employees -> Bitmap Index Scan on idx_employees_dept-- 适合:选择性中等,返回多行-- 并行扫描(Parallel Seq Scan)Parallel Seq Scan on employees Workers: 2-- 适合:大表扫描
-- Nested Loop JoinNested Loop -> Index Scan on departments -> Index Scan on employees-- 适合:小表驱动大表-- Hash JoinHash Join -> Seq Scan on departments -> Hash -> Seq Scan on employees-- 适合:大表等值连接-- Merge JoinMerge Join -> Index Scan on departments -> Index Scan on employees-- 适合:已排序数据
-- const:主键等值查询EXPLAIN SELECT * FROM employees WHERE id = 1;-- type: const-- ref:非唯一索引等值查询EXPLAIN SELECT * FROM employees WHERE dept_id = 5;-- type: ref-- range:范围查询EXPLAIN SELECT * FROM employees WHERE salary > 50000;-- type: range-- ALL:全表扫描EXPLAIN SELECT * FROM employees WHERE YEAR(created_at) = 2026;-- type: ALL(函数导致索引失效)
-- PostgreSQL:禁用顺序扫描SET enable_seqscan = off;-- MySQL:USE INDEX / FORCE INDEXSELECT * FROM employees USE INDEX (idx_dept) WHERE dept_id = 5;SELECT * FROM employees FORCE INDEX (idx_dept) WHERE dept_id = 5;-- Oracle:提示SELECT /*+ INDEX(e idx_dept) */ * FROM employees e WHERE dept_id = 5;