Work out table size estimate instantly with clear inputs, formula shown and shareable results.
Table storage is rows times row size plus per-row header overhead, inflated by page free space. What surprises people is the index share: four secondary indexes at roughly 32 bytes per entry can approach or exceed the size of the row data itself, and they must all be kept in memory for lookups to stay fast.
Table footprint
heap = rows x (row bytes + header) / page fill; index bytes = indexes x rows x entry size / index fill; total = heap + indexes
PostgreSQL adds a 23-byte tuple header plus alignment padding, and MySQL InnoDB adds transaction and roll-pointer fields. On narrow rows that overhead can exceed the data.
Drop unused indexes, choose narrower types, order columns to reduce alignment padding, and move rarely read large columns to a separate table or object storage.