Tutorial
5 PostgreSQL Tips Som Sparade Mig Timmar av Debugging
·5 min läsning
5 PostgreSQL Tips Som Sparade Mig Timmar av Debugging
PostgreSQL är en fantastisk databas, men det finns några saker som kan spara dig massor av huvudvärk. Här är mina bästa lärdomar.
1. Indexera Smart, Inte Överallt
Dåligt:
-- Index på allt "för säkerhets skull"
CREATE INDEX idx_everything ON users (id, email, name, created_at, updated_at);
Bra:
-- Index baserat på faktiska queries
CREATE INDEX idx_users_email ON users (email);
CREATE INDEX idx_users_created ON users (created_at DESC);
Pro tip: Använd EXPLAIN ANALYZE för att se vilka index som faktiskt används!
2. N+1 Problem - Den Klassiska Fällan
Problem:
// Hämtar posts
const posts = await db.query('SELECT * FROM posts');
// Sen en query PER post för author (💀)
for (const post of posts) {
post.author = await db.query('SELECT * FROM users WHERE id = $1', [post.author_id]);
}
Lösning:
// En query med JOIN
const posts = await db.query(`
SELECT
posts.*,
users.name as author_name,
users.email as author_email
FROM posts
LEFT JOIN users ON posts.author_id = users.id
`);
Från 101 queries till 1 query! 🚀
3. Partial Index för Bättre Performance
-- Istället för att indexera alla användare:
CREATE INDEX idx_users_email ON users (email);
-- Indexera bara aktiva användare (mindre index = snabbare):
CREATE INDEX idx_active_users_email ON users (email)
WHERE deleted_at IS NULL;
Detta kan göra queries 10x snabbare på stora tabeller!
4. Connection Pooling
Dåligt:
// Ny connection för varje query
const client = new Client(config);
await client.connect();
const result = await client.query('SELECT * FROM users');
await client.end();
Bra:
// Använd en pool
const pool = new Pool(config);
const result = await pool.query('SELECT * FROM users');
// Connection återanvänds automatiskt!
Resultat: -70% latency på queries!
5. JSON Columns När Det Passar
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name VARCHAR(255),
specs JSONB -- Flexibelt för olika produkttyper!
);
-- Query med JSON
SELECT * FROM products
WHERE specs->>'brand' = 'Apple';
-- Index på JSON fields
CREATE INDEX idx_products_brand ON products ((specs->>'brand'));
Perfekt för data som har varierande struktur!
Bonus: Monitoring
-- Se långsamma queries
SELECT
query,
calls,
total_time,
mean_time
FROM pg_stat_statements
ORDER BY mean_time DESC
LIMIT 10;
Installera pg_stat_statements extension - livräddar för debugging!
Sammanfattning
- ✅ Indexera baserat på faktiska queries
- ✅ Undvik N+1 problem med JOIN
- ✅ Använd partial index för subset av data
- ✅ Connection pooling är ett måste
- ✅ JSONB för flexibel data
PostgreSQL är kraftfullt när man använder det rätt. Dessa tips har sparat mig otaliga timmar av debugging!
Behöver du hjälp med din databas-arkitektur? Hör av dig!