Hotjar’s user recordings count above 400 million, with supporting tables containing 4.5 billion records. This 5TB data fits nicely into Postgres and doesn’t quite merit the full big data suite of tools. However, at the rate of 1000 recordings per minute, and overall request rate of 750K per minute, the penalty of inefficient queries and updates can quickly cause nasty performance spikes if not thought out well.
This talk is about the challenges we faced at the lower end of big data: the good decisions which helped keep our application running and other lessons we had to learn the hard way
Considerations for Database Design
- Design entities for the domain
- Balance normalization with performance
- Sharding later has big migration costs, consider designing for this early
Speak to the database from your Web Application
- Why use ORMs and at which level of abstraction?
- Stored Procedures are fast, should we have more of those?
Bringing data closer to the application
- Materialize Views
- Defer aggregations
- Application Level Caching
Handling Operational Troubles
- Explain(analyze, buffers) is your friend
- Detect and manage Index Bloat
- Reduce Deadlocks
Reducing Impact of Background Maintenance Jobs
- Keep impact on database low with cursors and streaming
- Plan data retention policies early, so cleaning can be an ongoing process