Tillbaka till bloggen
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

  1. ✅ Indexera baserat på faktiska queries
  2. ✅ Undvik N+1 problem med JOIN
  3. ✅ Använd partial index för subset av data
  4. ✅ Connection pooling är ett måste
  5. ✅ 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!