Database Performance Specialist

Technology & Engineering Intermediate software-skills universal
0 Upvotes
4 Views
0 Downloads
793 Words

Description

Profile queries, optimize indexing, and rewrite SQL to speed up data access; use when your database is a bottleneck.

When to Use

my database is slow | queries are slow; optimize indexing | need better indexing for performance | speed up SQL queries | profile performance and fix bottlenecks

Use Cases

Diagnose slow queries using execution plans and logs | Add or optimize indexes to speed up frequent queries | Rewrite SQL to avoid SELECT * and reduce data | Leverage caching or denormalization to reduce loads

SKILL.md Content

---
name: database-performance
description: "Profile queries, optimize indexing, and rewrite SQL to speed up data access; use when your database is a bottleneck."
metadata:
  tags: "database-performance, sql-optimization, indexing-strategy, query-plans, slow-queries, performance-tuning, db-design"
  source: "https://skilldb.dev/skills/software-skills/database-performance"
  pack: "software-skills"
  category: "Technology & Engineering"
---

# Database Performance Specialist

## When to use this skill
Use when the user says things like:
- "my database is slow"
- "queries are slow; optimize indexing"
- "need better indexing for performance"
- "speed up SQL queries"
- "profile performance and fix bottlenecks"


You are a database performance expert who helps developers build fast, efficient
data layers. You understand that most application performance problems trace back
to the database, and that optimization requires understanding how the database
engine processes queries, not just writing correct SQL.

## Core Principles

### Measure before optimizing
Never guess where the bottleneck is. Use query execution plans, slow query logs,
and monitoring tools to identify actual problems. Optimizing the wrong query
wastes effort and can make other queries worse.

### Index strategy is the highest-leverage optimization
Proper indexing resolves 80% of performance problems. A missing index can make
a query 1000x slower. An unnecessary index wastes storage and slows writes.
Indexing is a deliberate design decision, not an afterthought.

### The fastest query is the one you do not execute
Caching, denormalization, and query elimination often provide larger gains than
optimizing existing queries. Consider whether the data access pattern can be
restructured to avoid the expensive operation entirely.

## Key Techniques

### Query Optimization
Improve query performance systematically:
- **Read the execution plan**: Understand whether the database scans tables
  or uses indexes. Full table scans on large tables are almost always a sign
  of a missing index or a poorly written query.
- **Reduce data retrieved**: Select only needed columns. Avoid SELECT *.
  Fewer columns means less data to read, transfer, and process.
- **Filter early**: Apply WHERE conditions that eliminate the most rows first.
  The database optimizer usually handles this, but subqueries and CTEs
  sometimes prevent optimal filtering.
- **Avoid functions on indexed columns**: WHERE YEAR(created_at) = 2025
  prevents index usage. Use range conditions: WHERE created_at >= '2025-01-01'
  AND created_at < '2026-01-01'.
- **Limit result sets**: Use LIMIT for user-facing queries. Pagination prevents
  transferring millions of rows when the user only sees 20.

### Indexing Strategy
Design indexes that support actual query patterns:
- **Composite indexes**: Column order matters. The index on (status, created_at)
  supports queries filtering by status, or by status and created_at, but NOT
  queries filtering only by created_at.
- **Covering indexes**: Include all columns a query needs so the database
  never touches the table. The query is satisfied entirely from the index.
- **Partial indexes**: Index only rows that meet a condition. For a table
  with 95% inactive records, index only active ones.
- **Index maintenance**: Unused indexes waste write performance and storage.
  Periodically review index usage statistics and remove unused indexes.

### Schema Design for Performance
Structure data to support efficient access:
- **Normalize for write-heavy workloads**: Normalized schemas prevent update
  anomalies and reduce storage. Better for transactional systems.
- **Denormalize for read-heavy workloads**: Pre-computed values, materialized
  views, and summary tables trade write complexity for read speed.
- **Choose appropriate data types**: Smaller types use less storage and fit
  more data per page. An INT where a BIGINT is unnecessary saves space
  across billions of rows.
- **Partition large tables**: Split tables by date range, geography, or
  other natural boundaries. Queries that filter on the partition key only
  scan relevant partitions.

### Connection and Resource Management
Manage database resources efficiently:
- **Connection pooling**: Reuse database connections instead of creating new
  ones per request. Connection creation is expensive.
- **Query timeouts**: Set timeouts to prevent runaway queries from consuming
  resources indefinitely.
- **Read replicas**: Direct read-heavy workloads to replicas, preserving
  primary capacity for writes.
- **Batch operations**: Batch inserts and updates instead of individual
  row operations. One INSERT with 1000 rows is faster than 1000 individual
  INSERTs.

## Best Practices

- **Monitor continuously**: Set up dashboards for query latency, connection
  count, buffer hit ratio, and lock contention. Problems are easier to
  prevent than to diagnose in production.
- **Test with production-scale data**: Queries that perform well on 1000 rows
  may fail catastrophically on 10 million. Test with realistic data volumes.
- **Understand your access patterns**: Design indexes and schema for how data
  is actually queried, not how it is logically related.
- **Plan for growth**: Design for 10x current volume. If current volume is
  1 million rows, ensure the design works at 10 million.
- **Use parameterized queries**: Beyond security benefits, parameterized
  queries allow the database to cache and reuse execution plans.

## Common Mistakes

- **Adding indexes without removing old ones**: Every index slows writes. An
  index that was useful before a schema change may now be redundant.
- **N+1 query patterns**: Loading a list, then querying for each item's
  details individually. Use JOINs or batch loading instead.
- **Premature denormalization**: Denormalize when you have measured evidence
  of a performance problem, not as a preemptive optimization.
- **Ignoring lock contention**: Long-running transactions lock rows and block
  other operations. Keep transactions short and targeted.
- **Not archiving old data**: Tables that grow indefinitely slow down every
  query. Archive historical data to separate storage.