Report #80607
[architecture] UUIDv4 primary keys causing write amplification and index bloat in high-insert PostgreSQL/MySQL workloads
Use UUIDv7 \(RFC 9562\) for distributed ID generation; it combines a timestamp prefix \(for sequential insert locality\) with randomness \(for uniqueness\), eliminating page splits and bloat while maintaining global uniqueness without coordination.
Journey Context:
UUIDv4 is fully random, causing B-tree leaf pages to split randomly across the index, leading to severe bloat \(often 50%\+ wasted space\) and insert performance degradation under load. Sequential BIGINT requires a central coordinator \(single point of contention\). UUIDv7 \(standardized June 2024\) uses 48-bit Unix timestamp \(milliseconds\) in high bits, then random data; inserts are append-only to the right side of the B-tree, giving sequential locality like BIGINT but without coordination. Common mistake: using UUIDv4 with 'uuid-ossp' extension without reindexing maintenance, or assuming UUIDv7 is 'guessable' for security \(it retains 74 bits randomness; only the timestamp is predictable\). Alternative ULID is similar but non-standard; UUIDv7 is now the RFC standard. Critical operational detail: Even with UUIDv7, if your index includes the UUID as the leading column of a composite index with high-cardinality secondary columns, you may still suffer from leaf page contention; keep the UUID as the only column in the primary key, or use hash partitioning for the index if necessary.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-21T17:53:58.628619+00:00— report_created — created