- ab
- jmeter
- Inspector
- Telescope
- OpenTelemetry
- XDebug + qcachegrind
- Clockwork
- htop
- How to start measuring performance?
- Solutions
- Prevent lazy loading
- Let the client decide what it wants
- Cursor pagination
- Theory Arrays
- Linked list
- Binary tree
- Binary search tree (BST) Indexing in the early days
- Single-level indexing
- Multi-level indexing B-Tree
- Problems with B-Trees B+ Trees
- Index access types const
- range
- range (again) index
- ALL
- Select *
- Composite indexes Cardinality
- Database indexing in practice Listing posts by status Feed
- Publishing posts
- Avoiding memory problems Avoiding spamming the database Measuring performance
- Web scraping with jobs Concurrent programming
- Concurrent programming
- fork
- Concurrent HTTP requests Queues and workers
- Queues and workers
- supervisor
- Multiple queues and priorities
- Optimizing worker processes
- Exports
- Imports
- Generators & LazyCollections
- PHP generators
- Imports with generators
- Imports with LazyCollections
- Reading files
- Deleting records
- fpm processes
- nginx cache
- Caching static content
- Caching fastcgi responses
- MySQL slow query log
- Monitoring database connections
- Docker resource limits
- Health check monitors
Building an analytics platform
- v1
- v2
- v3
- v4
- v5
- Page views
- Unique visitors
- Most visited pages
- site_id index
- visited_at and site_id composite index
- site_id and visited_at composite index
- Querying page views
- Daily and monthly page views
- Scaling down the problem
- Inserting page views
- Time complexity
- Querying unique visitors
- Daily and monthly unique visitors
- HyperLogLog
- Daily unique visitors
- Monthly unique visitors
- Hourly unique visitors
- Scaling down the problem
- Inserting unique visitors
- Time complexity
- Memoization
- Querying most visited pages
- Scaling down the problem
- Inserting most visited page views
- Time complexity
- The event stream
Thank you!