Optimizing Database Queries: From Slow to Fast
12 min read
Database
Performance
SQL
Optimization
Optimizing Database Queries: From Slow to Fast
Database performance can make or break your application. Let's explore practical techniques for optimizing queries.
Identifying Slow Queries
First, you need to find the bottlenecks. Most databases provide query analysis tools:
-- PostgreSQL: Enable query timing
EXPLAIN ANALYZE
SELECT * FROM users
WHERE created_at > '2024-01-01'
ORDER BY created_at DESC;
Indexing Strategies
Indexes are your first line of defense against slow queries:
-- Create index on frequently queried columns
CREATE INDEX idx_users_created_at ON users(created_at);
-- Composite index for multiple columns
CREATE INDEX idx_users_email_status ON users(email, status);
-- Partial index for specific conditions
CREATE INDEX idx_active_users ON users(id) WHERE status = 'active';
N+1 Query Problem
One of the most common performance issues:
// Bad: N+1 queries
const users = await db.users.findMany();
for (const user of users) {
const posts = await db.posts.findMany({ where: { userId: user.id } });
}
// Good: Single query with join
const users = await db.users.findMany({
include: { posts: true }
});
Query Optimization Techniques
- Select only needed columns: Don't use
SELECT * - Use LIMIT: Paginate large result sets
- Avoid subqueries: Use JOINs when possible
- Cache frequently accessed data: Use Redis or similar
-- Optimized query
SELECT id, name, email
FROM users
WHERE status = 'active'
LIMIT 100 OFFSET 0;
Connection Pooling
Manage database connections efficiently:
import { Pool } from 'pg';
const pool = new Pool({
max: 20, // Maximum connections
idleTimeoutMillis: 30000,
connectionTimeoutMillis: 2000,
});
Conclusion
Database optimization is an iterative process. Monitor your queries, add appropriate indexes, and always measure the impact of your changes.