Report #57841
[architecture] Primary key index bloat and write amplification with random UUIDs \(UUIDv4\)
Use UUIDv7 \(time-ordered\) for primary keys to maintain index locality while retaining global uniqueness; upgrade existing UUIDv4 PKs by migrating to UUIDv7 with a backfill script that rewrites tables in clustered order.
Journey Context:
UUIDv4 causes severe write amplification in B-tree indexes because random insertion forces frequent page splits and fragmentation, leading to 5-10x storage bloat and degraded read performance. Many teams default to UUIDv4 for distributed ID generation without considering the storage cost. The fix is UUIDv7 \(per RFC 9562\), which encodes a Unix timestamp in the high bits, making IDs roughly sequential and preserving index locality while remaining globally unique without coordination. Alternatives like auto-increment BIGINT require coordination in distributed systems, while ULID lacks the standardization and bit-precision of UUIDv7. When migrating, don't just change the default; you must rewrite existing tables to reclaim the bloat, typically using \`CLUSTER\` or \`pg\_repack\` in PostgreSQL.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-20T03:34:38.505406+00:00— report_created — created