AWS cost · RDS right-sizing
Why RDS looks expensive - and how to right-size the instance
Someone posted that cloud databases are “incredibly expensive for small projects.” They had a 100 million row MySQL table, asked an AI assistant to price out RDS, and got quoted db.t4g.large at about $106/month. That number is real - but it answers the wrong question. The same database runs fine on db.t4g.small at about $23/month. Here is why the tier was wrong, and how to size RDS to what your queries actually use.
A low-traffic MySQL database usually runs fine on db.t4g.small at about $23/month, not the $100+ tier an AI or a rushed guess tends to suggest. RDS instance size follows your working set - the data your queries actually touch - not your total row count. Match the RAM to real usage and the bill drops fast.
How much should a small RDS database cost?
Here are the current on-demand prices for the burstable t4g family (us-east-1, Single-AZ, compute only - storage and I/O are billed on top):
| Instance | RAM | Compute / month | |
|---|---|---|---|
| db.t4g.micro | 1 GiB | $11.68/month | |
| db.t4g.small | 2 GiB | $23.36/month | right answer here |
| db.t4g.medium | 4 GiB | $69.35/month | |
| db.t4g.large | 8 GiB | $106.58/month | what the AI quoted |
For a small, low-traffic workload, the jump from t4g.small to t4g.large buys 6 GiB of RAM you never touch. That is about $83/month - roughly $1,000 a year - for headroom the database does not use.
Why did the AI quote 4x too much?
The AI was not broken. It anchored on the size of the table - 100 million rows sounds huge - and picked an instance to match that number. But row count does not decide how much RAM a database needs. A large table with selective queries and low traffic keeps only a small working set in memory at once. The mistake was not the tool; it was that nobody stopped to question the tier.
How do I pick the right RDS instance size?
Size the instance to your working set, not your row count. The working set is the slice of data your queries actually read - indexes and hot rows - which is usually far smaller than the full table. Two quick checks in CloudWatch tell you if you are over-provisioned: FreeableMemory that stays high, and CPUUtilization that stays low. If both are true, drop a tier and watch the same two metrics. Repeat until you have a comfortable margin, not a wasteful one. This pulls average free memory over a window you set - lots of headroom means the instance is oversized:
# average FreeableMemory over a chosen window (edit the dates)
aws cloudwatch get-metric-statistics \
--namespace AWS/RDS --metric-name FreeableMemory \
--dimensions Name=DBInstanceIdentifier,Value=my-db \
--start-time 2026-07-01T00:00:00Z \
--end-time 2026-07-08T00:00:00Z \
--period 3600 --statistics AverageWhen does it make sense to leave RDS?
Usually it does not. Right-sizing captures most of the savings while you keep managed backups, patching, and failover. If the instance is already the right size and steady, the next lever is a reserved instance, which discounts the compute you were going to run anyway. Moving to a self-managed database on a tiny instance can look cheaper on paper, but you take on the operational work RDS was doing for you.
Want to know if you are overpaying for RDS - or anything else on your bill? Connect your account read-only and see what it is wasting, in real dollars.
The role can only read - Get, Describe, List, nothing else. Read the exact permissions before you deploy it, and delete the stack whenever you want.
Frequently asked questions
Why is my RDS bill so high?+
Most small RDS bills are high because the instance is over-provisioned. A low-traffic database on db.t4g.large (8 GiB RAM, about $106.58/month) usually runs the same on db.t4g.small (2 GiB, about $23.36/month).
What RDS instance size do I need for a small MySQL database?+
For a low-traffic MySQL database, db.t4g.small with 2 GiB of RAM is a common fit. Size to your working set - the data your queries actually touch - not your total row count.
How much does db.t4g.small cost?+
About $23.36/month for compute (us-east-1, Single-AZ, on-demand). Storage and I/O are billed separately on top of that.
Does a 100 million row table need a large instance?+
Not necessarily. A 100 million row table with selective queries on a low-traffic app can run on 2 GiB of RAM. Row count does not set instance size; working set does.
db.t4g.large vs db.t4g.small - what is the difference?+
t4g.large has 8 GiB of RAM (about $106.58/month) and t4g.small has 2 GiB (about $23.36/month). For a small workload the extra RAM sits idle, so you pay about $83/month for headroom you never use.
How do I know if my RDS instance is over-provisioned?+
Check CloudWatch for FreeableMemory and CPUUtilization. Consistently high freeable memory and low CPU means you can drop a tier and still have a comfortable margin.
Should I move off RDS to save money?+
Usually not. Right-sizing the instance captures most of the savings while you keep managed backups, patching, and failover. Leave RDS only if you genuinely do not need a managed database.
Related cost breakdowns
Why Athena is expensive: $5 per TB scanned
Athena charges $5 per terabyte scanned, so an unpartitioned CSV table can cost 10 to 100 times more than the same data as partitioned Parquet. Here is where the scan cost comes from and how to cut it.
Your dev and staging RDS databases are billing 24/7
A dev database used 8 hours a day still bills for 24. Scheduling stop/start on non-production RDS saves 50 to 80%. Here is how to stop paying for databases nobody is using at night.
Multi-AZ is doubling your RDS bill - do you need it?
Multi-AZ runs a standby replica around the clock, so it roughly doubles the instance cost. Essential for production, wasteful for dev and staging. Here is how to tell, and how to fix it.
The RDS costs hiding in storage and backups
RDS storage and backups bill separately from the instance - over-provisioned gp2 disk and backups beyond 100% of your DB size add up quietly. Here is how to find and trim them.