Loading...
Loading...
Compare original and translation side by side
EXPLAIN (ANALYZE, BUFFERS, FORMAT TEXT)
SELECT ...; -- paste the full query hereEXPLAIN FORMAT=JSON
SELECT ...;EXPLAIN (ANALYZE, BUFFERS, FORMAT TEXT)
SELECT ...; -- paste the full query hereEXPLAIN FORMAT=JSON
SELECT ...;| Signal | What it means |
|---|---|
| No index — or the planner chose not to use one |
| Rows estimate far from actual | Stale statistics — run |
| May need a nested-loop + index for small inputs |
High | Heavily cached — latency is CPU-bound, not I/O |
High | I/O bound — consider indexes or read replicas |
| Covering index may eliminate heap fetches |
| 信号 | 含义 |
|---|---|
对大表执行 | 没有索引——或者查询优化器选择不使用索引 |
| 估算行数与实际行数差距过大 | 统计信息过时——执行 |
使用 | 对于小数据集,可能需要嵌套循环+索引 |
| 缓存命中率高——延迟受CPU限制,而非I/O |
| 受I/O限制——考虑添加索引或使用只读副本 |
| 覆盖索引可消除堆读取操作 |
-- B-tree for equality and range
CREATE INDEX CONCURRENTLY ON orders(user_id);
-- Partial index for common filter
CREATE INDEX CONCURRENTLY ON orders(created_at)
WHERE status = 'pending';
-- Covering index to eliminate heap fetch
CREATE INDEX CONCURRENTLY ON orders(user_id)
INCLUDE (status, total_amount);
-- Expression index for function-wrapped column
CREATE INDEX CONCURRENTLY ON users(lower(email));CONCURRENTLYJOINEXISTSSELECT *OFFSET-- Instead of: LIMIT 20 OFFSET 10000
WHERE id > :last_seen_id ORDER BY id LIMIT 20IN (SELECT ...)EXISTS (SELECT 1 FROM ...)ANALYZE orders; -- single table
ANALYZE; -- all tables (run as superuser)-- B-tree for equality and range
CREATE INDEX CONCURRENTLY ON orders(user_id);
-- Partial index for common filter
CREATE INDEX CONCURRENTLY ON orders(created_at)
WHERE status = 'pending';
-- Covering index to eliminate heap fetch
CREATE INDEX CONCURRENTLY ON orders(user_id)
INCLUDE (status, total_amount);
-- Expression index for function-wrapped column
CREATE INDEX CONCURRENTLY ON users(lower(email));CONCURRENTLYJOINEXISTSSELECT *OFFSET-- Instead of: LIMIT 20 OFFSET 10000
WHERE id > :last_seen_id ORDER BY id LIMIT 20EXISTS (SELECT 1 FROM ...)IN (SELECT ...)ANALYZE orders; -- single table
ANALYZE; -- all tables (run as superuser)EXPLAIN (ANALYZE, BUFFERS)EXPLAIN (ANALYZE, BUFFERS)-- Supports: orders list by user, filtered on status (POST /api/users/:id/orders)
CREATE INDEX CONCURRENTLY ON orders(user_id, status);-- Supports: orders list by user, filtered on status (POST /api/users/:id/orders)
CREATE INDEX CONCURRENTLY ON orders(user_id, status);