TL;DR
Using random UUIDs as primary keys in SQLite can significantly degrade performance due to their unordered nature, causing extra page re-balancing. Alternatives like UUID7 or different table structures may mitigate these issues.
Recent tests confirm that using random UUIDs (UUID4) as primary keys in SQLite significantly hampers database performance, with insert times increasing by up to 16 times compared to integer primary keys. This issue affects developers relying on UUIDs for distributed systems or data privacy, as it impacts scalability and efficiency.
Benchmarking shows that inserting 10 million rows with UUID4 as primary keys takes approximately 14-16 times longer than with integer primary keys, primarily due to the unordered nature of UUID4 forcing frequent re-balancing of the B-tree structure. This re-balancing increases disk I/O and CPU usage, leading to slower performance. Using UUID7, which is time-ordered, reduces this overhead but still remains slower than integer keys. Additionally, employing UUID4 with rowid-based tables does not fully resolve performance issues because the index still experiences random insertions, causing additional write amplification.
SQLite’s clustered index, which determines the physical storage order, is heavily impacted by unordered UUIDs, leading to costly page re-balancing operations. The problem is not unique to SQLite; other databases with clustered indexes face similar challenges when using random UUIDs as primary keys. Developers are advised to consider alternative UUID versions or table structures to optimize performance.
Why It Matters
This analysis highlights a critical performance pitfall for developers using UUIDs as primary keys in SQLite and similar databases. As distributed systems and privacy-preserving data models increasingly adopt UUIDs, understanding their impact on database efficiency becomes essential. Slow insert performance can hinder system scalability, increase operational costs, and complicate database maintenance, especially at scale.

Mastering SQLite with Python: From Basics to Advanced Techniques
As an affiliate, we earn on qualifying purchases.
As an affiliate, we earn on qualifying purchases.
Background
UUIDs are widely used for generating unique identifiers in distributed systems. UUID4, which is randomly generated, is popular for its simplicity and privacy benefits but is known to cause performance issues in databases with clustered indexes. Prior to this, most performance considerations focused on traditional integer keys, which are sequential and more efficient for indexing. The recent benchmarking confirms that the unordered nature of UUID4 leads to frequent B-tree re-balancing, a problem that has been discussed but not always quantified in real-world scenarios.
“The unordered nature of UUID4 causes frequent re-balancing of the B-tree, significantly slowing down insert operations.”
— source author
“Using UUID7 or other time-ordered UUIDs can mitigate some of the performance degradation, but not entirely match integer keys.”
— database performance expert
UUID4 vs UUID7 generator
As an affiliate, we earn on qualifying purchases.
As an affiliate, we earn on qualifying purchases.
What Remains Unclear
It remains unclear how widespread these performance issues are across different SQLite implementations and hardware environments. The full impact of alternative UUID versions, such as UUID7, on various workloads and database configurations is still being studied. Additionally, the long-term effects of using different table structures or indexing strategies require further analysis.
database indexing and re-balancing tools
As an affiliate, we earn on qualifying purchases.
As an affiliate, we earn on qualifying purchases.
What’s Next
Developers should evaluate their use of UUID primary keys, considering alternative UUID versions or table designs that reduce re-balancing overhead. Future updates may include optimized UUID algorithms or database features specifically addressing these performance issues. Additional benchmarking across diverse environments is expected to refine best practices.

GM82922 Generator Key Replacement Compatible with Kohler Generator Models 8RESV, 14RESA, 14RCA, 20RESA, 20RCA, 20RESC, 26RCA, Zinc Alloy with Chrome-Plated Surface
Wide Compatibility: Compatible with Kohler generator models, including 8RESV, 10RESV, 10RESVL, 12RESV, 12RESVL, 14RESA, 14RESAL, 20RESA, 20RESAL, 20RESC,…
As an affiliate, we earn on qualifying purchases.
As an affiliate, we earn on qualifying purchases.
Key Questions
Why do UUID4 primary keys slow down SQLite performance?
Because UUID4 generates random, unordered identifiers, inserting them into a clustered index causes frequent re-balancing of the B-tree, increasing disk I/O and CPU load, which slows down insert operations.
Can switching to UUID7 improve performance?
Yes, UUID7 is time-ordered, reducing the randomness of insertions and thus decreasing re-balancing overhead. However, it may still be slower than using integer primary keys.
Are these issues unique to SQLite?
No, similar performance impacts are observed in other databases that use clustered indexes with unordered primary keys, though the severity varies by system.
What are the best practices for using UUIDs in SQLite?
Consider using time-ordered UUIDs like UUID7, or avoid UUIDs as primary keys in performance-critical applications. Alternative table structures, such as WITHOUT ROWID tables, may also help mitigate issues.
Source: Hacker News