# PostgreSQL developer — since 2010

> I work with PostgreSQL: queue-table and index behaviour measurements, partial indexes, vector search with pgvector and relational store decisions.

- Highlights: 16 years
- Experience: Since 2010
- Updated: 2026-11-08
- Source: https://muhammetsafak.com/expertise/postgresql/
- Language: en-US
- Author: Muhammet Şafak

---
## Me in the PostgreSQL ecosystem

PostgreSQL is less a storage choice for me than a surface to measure. The measurements I have published on index and queue-table behaviour rest on a benchmark and a described environment; instead of "it usually goes like this" I write what I measured and where it broke. The measurements are [in the Research section](https://muhammetsafak.com/research/partial-index-queue-table/): partial indexes, bloat and autovacuum, and whether the planner switches to a generic plan.

The architecture side of this work connects to the frame on the [Software Architecture](https://muhammetsafak.com/expertise/architecture/) page: adding a new data store is a decision, and one more system to operate. On the backend side it is an everyday part of schema and query design in the [Backend](https://muhammetsafak.com/expertise/backend/) role.

I have worked with MySQL longer; what I say about PostgreSQL comes only from the measurements I made on PostgreSQL.

## What is the PostgreSQL Developer role?

PostgreSQL is an open source object-relational database system that extends the SQL language; it is ACID-compliant, uses multi-version concurrency control (MVCC) and is extensible. A PostgreSQL developer is the person who designs the schema, the query and the index around how this system behaves.

## What does the PostgreSQL Developer do?

In PostgreSQL I design schemas, queries and indexes; on heavily updated tables such as queue tables I measure index and vacuum behaviour. Where I can, I keep vector search inside PostgreSQL with pgvector instead of moving it to a separate store. Before adding a new data store I look at where PostgreSQL's own tools are enough.

## Technologies I pair it with

- PostgreSQL: The database I measured queue-table and index behaviour on.
- pgvector: The extension that keeps vector search inside PostgreSQL instead of a separate store.
- MySQL: The relational store I have worked with longest.
- Redis: Cache, counters and short-lived locks.
- RabbitMQ: Asynchronous delivery between services; the exit door of the outbox relay.
- Elasticsearch: Where relational stops being enough: full-text search and log analysis.
- Docker: Development environment and deployment unit.

## Questions in this area

- [How do I handle read-after-write when replication lag hides a user's own just-written data?](https://muhammetsafak.com/just-ask/read-after-write-lag-hides-just-written-data/) (2026-11-03)
- [Should I use a GIN index or a generated column to filter on fields inside a JSONB column?](https://muhammetsafak.com/just-ask/gin-index-generated-column-filter-inside-jsonb-column/) (2026-10-06)
- [When should I switch to a covering index with INCLUDE to get an index-only scan?](https://muhammetsafak.com/just-ask/switch-covering-index-include-get-index-only-scan/) (2026-09-08)

## Frequently asked

### How long have you worked with PostgreSQL?

Since 2010 — 16 years.

### What does a PostgreSQL developer do?

A PostgreSQL developer designs schemas, queries and indexes, and builds the application around how the database behaves. For me that means measuring index and vacuum behaviour on heavily updated tables such as queue tables, and keeping vector search inside PostgreSQL where it fits.

### How do you choose between PostgreSQL and MySQL?

MySQL is the relational store I have worked with longest; my queue-table and index measurements, though, I made on PostgreSQL. The measurements I have belong to PostgreSQL, and I do not make the same claim for MySQL. The choice comes from the workload and the team's knowledge, not the brand.

### Do you use a partial index on a queue table?

I measured it: a partial index shrinks the index on a queue table markedly, but only for as long as the planner picks it. I also measured bloat and autovacuum behaviour, and whether the planner switches to a generic plan, separately. All the findings are [in the Research section](https://muhammetsafak.com/research/partial-index-queue-table/).

### Do you need a separate database for vector search?

Not always. pgvector keeps vector search inside PostgreSQL instead of moving it to a separate store. For large embedding collections I look at a distributed vector database such as Milvus.

### Do you relay the outbox table by polling or with Debezium CDC?

A polling relay tuned with SKIP LOCKED, batching and a partial index is enough for most teams. I move to Debezium where measured latency or database load pinches.

### What do you check before adding a new data store?

Whether PostgreSQL's own tools already solve the problem. A separate store is one more system to operate, so I measure the limit of what I already have first.
