reWhy IndexedDB is slow and what to use instead

time to read 2 min | 322 words

I ran into this post and I thought that I would share my thinking on the matter. I don’t actually know anything about IndexedDB, but I have been working with databases for a sufficiently long time to understand what the root problem here is.

The issue the post is talking about is that IndexedDB is slow, to the rate of inserting hundreds of documents takes multiple seconds. When you go a bit deeper into the post, you realize that the trouble is not with the number of documents that are being saved, but the number of transactions.

IndexedDB has the concept of transactions, and I’m going to err on the safe side and assume that it has durability. I dug a bit and found that IndexedDB is based on LevelDB (and I do know that one quite a bit). The underlying issue is that each transaction commit needs to issue an fsync(), and fsync is slow!

Pretty much all database engines have to deal with that, the usual answer is to allow transaction merging of some sort. Many relational databases will write to the log and commit multiple transactions in a single fsync(), RavenDB will do explicit transaction merging in order to batch writes to disk.

However, for pretty much every database out there with durability guarantees, the worst thing you can do is write a lot of data one transaction at a time. Server databases still benefit from being able to amortize multiple operations across different requests, but a client side database is effectively forced to do serial work with no chance for optimization.

From the client perspective, the only viable option here is to batch writes to get better performance. Then again, if you are working on the client side, you are either responding to a user action (in which case you have plenty of time to commit) or running in the background, which means that you have the ability to batch.

More posts in "re" series:

  1. (15 Jan 2024) S06E09 - From Code Generation to Revolutionary RavenDB
  2. (02 Jan 2024) .NET Rocks Data Sharding with Oren Eini
  3. (01 Jan 2024) .NET Core podcast on RavenDB, performance and .NET
  4. (28 Aug 2023) RavenDB and High Performance with Oren Eini
  5. (17 Feb 2023) RavenDB Usage Patterns
  6. (12 Dec 2022) Software architecture with Oren Eini
  7. (17 Nov 2022) RavenDB in a Distributed Cloud Environment
  8. (25 Jul 2022) Build your own database at Cloud Lunch & Learn
  9. (15 Jul 2022) Non relational data modeling & Database engine internals
  10. (11 Apr 2022) Clean Architecture with RavenDB
  11. (14 Mar 2022) Database Security in a Hostile World
  12. (02 Mar 2022) RavenDB–a really boring database