18.2 Aurora vs Standard RDS: Performance, Cost, and Compatibility
Right, let’s settle this. You’re staring at the RDS creation screen, and the “DB Engine” dropdown is staring back. “mysql” and “aurora-mysql” look suspiciously similar. Is it just a more expensive, fancier version, or is there actual magic inside? Buckle up. The difference isn’t just in the price tag; it’s a fundamental architectural divorce. One is a managed traditional database, the other is a reimagined, cloud-native storage system that just so happens to speak the MySQL protocol.
The Architecture Split: Why Your Database Isn’t on a Single Server Anymore
Think of standard RDS MySQL/PostgreSQL like a very well-maintained car. AWS handles the oil changes, tire rotations, and towing (provisioning, patching, backups). But underneath, it’s still a single engine connected to a single transmission. If that engine seizes, we’re waiting for a tow truck (a failover event), which takes time. The storage is directly attached to that virtual machine.
Aurora is different. It’s more like a… teleportation device. When you write data, you’re not writing to one machine. You’re sending it to a distributed, self-healing storage layer that’s replicated across at least 3 Availability Zones, six ways. No, really, six copies. The database instances (the ones you see as “writers” and “readers”) are now just stateless computers. They’re gloriously powerful CPUs and RAM that cache data and compute queries. The actual source of truth is that distributed storage volume. This is why Aurora’s failovers are measured in seconds, not minutes. The new writer just has to spin up and point to the storage volume, which never went offline. It’s a ridiculously elegant hack.
Performance: Where You’ll Actually Feel the Difference
This architecture has profound performance implications. The biggest win is offloading the redo log apply. In standard MySQL, a write operation isn’t done until it’s not only in memory but also written to the transaction logs on disk. This I/O is a classic bottleneck.
Aurora cheats. The primary instance sends only the redo log entries to the storage layer. The storage nodes themselves are responsible for building database pages in the background. This means the database instance isn’t waiting on that costly disk I/O. The result? You can push a lot more write throughput.
Want to see it? Let’s run a quick sysbench. First, on a standard RDS MySQL db.m5.2xlarge:
sysbench oltp_write_only --table-size=10000000 --db-driver=mysql --mysql-host=your-standard-mysql.1234567890.us-east-1.rds.amazonaws.com --mysql-user=admin --mysql-password=pass run
You’ll get a number for transactions per second. Now, run the same test on an aurora-mysql db.r5.2xlarge (or better, a serverless v2 instance with similar ACU capacity). Go on, I’ll wait.
…See? It’s not even a fair fight. The Aurora instance will absolutely smoke the standard one on sustained write-heavy workloads. For read-heavy loads, the ability to spin up 15 read replicas that all pull from the same shared storage, without binlog replication lag, is a game-changer for scaling.
The Cost Conversation: It’s More Complicated Than You Think
Yes, Aurora is more expensive on a per-instance-hour basis. A db.r5.large costs more than a db.m5.large. The trap is looking only at that line item. You must factor in what you’re not paying for.
With standard RDS, if you need high IOPs, you pay for provisioned IOPS (PIOPS). Need more storage? You provision it and pay for it, even if it’s empty. Need to scale IOPs? That’s a multi-step manual process with likely downtime.
Aurora’s storage is a completely different beast. It’s auto-scaling. You pay per GB-month for what you actually use, and IOPs are effectively decoupled from storage size and are “free.” You don’t provision them. The performance scales with the workload. So while the instance cost is higher, the storage and IOPs line items often vanish or are drastically lower. You’re trading predictable, itemized costs for a simpler but potentially more expensive overall package. For many production workloads, the operational simplicity and performance are worth the premium. For a dev box that sits idle 16 hours a day? Probably not.
Compatibility: The Devil’s in the Details (and the Parameters)
This is where Aurora’s “clever hack” shows some seams. It mostly speaks the MySQL or PostgreSQL wire protocol. Emphasis on mostly. Certain operations that poke at the underlying storage engine can behave differently.
For MySQL, the big one is InnoDB-specific features. Since Aurora uses its own distributed storage engine, things like innodb_file_per_table are meaningless. You can’t just copy .ibd files around. The ibdata1 file isn’t a thing here. This also means some third-party tools that expect to interact with the local file system might break.
The parameter groups are different, too. You’ll find Aurora-specific parameters for managing things like the backtrack window (a fantastic feature that lets you rewind a cluster to a point in time without restoring from a backup, like a git revert for your database).
Always, and I mean always, check the AWS documentation for the specific version you’re using to see the list of unsupported features. Don’t assume 100% compatibility. Test your application’s specific quirks.
So, When Do You Choose Which?
Here’s the brutal honesty:
Choose Standard RDS when:
- Your workload is predictable and fits nicely on a single instance.
- You need the absolute lowest cost for a dev/test environment or a low-traffic application.
- You are using features that are explicitly not supported in Aurora (check that list!).
- You have a legacy application that relies on specific storage-level tricks.
Choose Aurora when:
- Availability is non-negotiable. The faster failover and storage-level redundancy are worth it.
- Your workload is bursty or growing unpredictably (especially with Serverless v2).
- You need insane read scaling with minimal replica lag.
- You’re tired of capacity planning for storage and IOPs and just want it to work.
- The performance boost on writes will save you from scaling to a larger, even more expensive instance class.
It’s not an automatic “always choose Aurora” situation. It’s a tool. A brilliant, powerful, sometimes pricier tool. Use it where it makes sense, and your life will be significantly easier. Use it where it doesn’t, and you’ll just have a fancier, more expensive bill.