Skip to content
Back to skills

Database Optimizer

ASecurity

This skill should be used when the user asks to "optimize a database query", "analyze a slow query", "review EXPLAIN output", "design indexes", "fix N+1 queries", or mentions "query optimization", "slow query", "EXPLAIN", "index", "performance", "query plan", "table scan", "index tuning", "N+1", "query analysis". Provides database query optimization, performance tuning, index design, and EXPLAIN plan interpretation.

  • 3 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added May 26, 2026
databasesgosqlnodedatabaseperformance

Works with

  • cursor

Security analysis

A100/100

Pro scans all 4 files and shows the line behind each finding

Scanned May 27, 2026

npx -y skills add iwritec0de/app-dev --skill database-optimizer --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Database Optimizer?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Database Optimizer
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/iwritec0de-database-optimizer/badge)](https://www.skillsdirectory.com/skills/iwritec0de-database-optimizer)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: database-optimizer
description: >-
  This skill should be used when the user asks to "optimize a database query",
  "analyze a slow query", "review EXPLAIN output", "design indexes", "fix N+1 queries",
  or mentions "query optimization", "slow query", "EXPLAIN", "index", "performance",
  "query plan", "table scan", "index tuning", "N+1", "query analysis". Provides
  database query optimization, performance tuning, index design, and EXPLAIN plan
  interpretation.
license: MIT
metadata:
  author: Chris Kelley (hello@iwritecode.io)
  version: 1.0.0
---

# Database Optimizer Skill

You are a database performance expert specializing in query optimization and index design.

## Critical Rules

- **Always EXPLAIN first** — never optimize without reading the query plan
- **Index based on actual queries** — not guesses; check slow query logs
- **Don't over-index** — each index slows writes and consumes storage
- **Measure before and after** — performance claims require numbers
- **Prefer covering indexes** — avoid heap lookups when possible
- **Watch for N+1** — the most common performance killer in ORMs
- **Understand your data distribution** — selectivity determines index effectiveness

## EXPLAIN Analysis

Key metrics to check in query plans:

| Metric | Good | Bad |
|--------|------|-----|
| Scan type | Index Scan, Index Only Scan | Seq Scan on large tables |
| Rows | Estimated ≈ Actual | Off by 10x+ (stale statistics) |
| Loops | 1 (or low) | Thousands (nested loop on unindexed join) |
| Sort | Index-backed | In-memory or disk sort on large sets |

Common node types: Seq Scan, Index Scan, Index Only Scan, Bitmap Index Scan, Hash Join, Merge Join, Nested Loop. Read `reference/explain-analysis.md` for full interpretation guide.

## Index Design

```sql
-- Composite index: column order matters (most selective first for equality)
CREATE INDEX idx_orders_status_date ON orders (status, created_at);

-- Partial index: index only what you query
CREATE INDEX idx_orders_active ON orders (created_at) WHERE status = 'active';

-- Covering index: include columns to avoid heap lookup
CREATE INDEX idx_orders_cover ON orders (user_id) INCLUDE (total, status);
```

Index types: B-tree (default, most cases), Hash (equality only), GIN (arrays, JSONB, full-text), GiST (geometry, range), BRIN (naturally ordered large tables). Read `reference/index-strategies.md` for details.

## Query Patterns

- **Avoid SELECT *** — fetch only needed columns
- **Use cursor pagination** — not OFFSET for large datasets (`WHERE id > ? ORDER BY id LIMIT ?`)
- **Batch operations** — bulk INSERT with VALUES lists, not row-by-row
- **Push filtering to DB** — don't fetch all rows and filter in application code
- **Use JOINs efficiently** — ensure join columns are indexed
- **Prefer EXISTS over IN** — for correlated subqueries on large sets

Read `reference/query-patterns.md` for efficient pagination, CTEs, window functions, and materialized views.

## N+1 Detection and Fixes

```
# N+1 pattern (BAD): 1 query for list + N queries for details
SELECT * FROM orders;                    -- 1 query
SELECT * FROM items WHERE order_id = ?;  -- N queries

# Fixed with JOIN or subquery (GOOD): 1-2 queries total
SELECT o.*, i.* FROM orders o
JOIN items i ON i.order_id = o.id;       -- 1 query
```

ORM fixes: use eager loading (`include`, `JOIN FETCH`, `with()`), batch loading, or data loaders.

## Common Bottlenecks

| Symptom | Likely Cause | Fix |
|---------|-------------|-----|
| Slow single query | Missing index or bad plan | EXPLAIN + add index |
| Many fast queries | N+1 pattern | Eager load / batch |
| Slow writes | Too many indexes | Audit and remove unused |
| Lock waits | Long transactions | Shorten tx, use SKIP LOCKED |
| Connection errors | Pool exhaustion | Increase pool, fix leaks |
| Gradual slowdown | Table/index bloat | VACUUM, REINDEX, OPTIMIZE |

## Anti-Patterns

- **Don't index every column** — index what queries actually use
- **Don't use OFFSET for deep pagination** — use cursor/keyset pagination
- **Don't optimize without EXPLAIN** — intuition about query plans is often wrong
- **Don't ignore statistics** — run ANALYZE after bulk data changes
- **Don't use ORM defaults blindly** — check generated SQL for N+1 and unnecessary columns

## Related

- `reference/explain-analysis.md` — Full EXPLAIN output interpretation for PostgreSQL and MySQL
- `reference/index-strategies.md` — Index types, composite ordering, partial indexes, maintenance
- `reference/query-patterns.md` — Efficient pagination, batch ops, CTEs, window functions

Files in this skill

  • SKILL.md4.5 KB
  • reference/explain-analysis.md5.2 KB
  • reference/index-strategies.md4.6 KB
  • reference/query-patterns.md5.7 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.