Amazon Aurora is Now 60 Times Faster than RDS for MySQL. Really.
Tags: aws, performance, mysql, database
Published: 2023-07-26 16:52:06

Today I will perform ~~a simple test~~ a proper benchmark, comparing Aurora MySQL and RDS for MySQL. 

Unlike traditional benchmarks that are lengthy and complex, this evaluation will be concise, comprising only about 200 words and taking just a couple of minutes to review the results.

First, let’s create two instances, using the AWS CLI. To ensure a fair comparison, we will create two instances using default values. Both instances will have the same class and size, db.t4g.medium, and will be located in the same AWS region, Frankfurt.

```
# Aurora

$ aws rds create-db-cluster --db-cluster-identifier benchmark --engine aurora-mysql --engine-version 8.0 --master-username renato --master-user-password ******** --db-subnet-group-name renato --vpc-security-group-ids sg-030c9f25422a13fea
$ aws rds create-db-instance --db-instance-identifier benchmark --db-cluster-identifier benchmark --engine aurora-mysql --db-instance-class db.t4g.medium

# RDS

$ aws rds create-db-instance --db-instance-identifier benchmark-rds --engine mysql --db-instance-class db.t4g.medium --master-username renato --master-user-password ******** --allocated-storage 100 --vpc-security-group-ids sg-030c9f25422a13fea

```

The benchmark process will involve creating a database, a table, and a MySQL procedure on both endpoints. This procedure will simply insert 100K records into the table, generating random values to introduce some data variety.

```
CREATE DATABASE renato;
USE renato;

CREATE TABLE renato
(id bigint(20) NOT NULL AUTO_INCREMENT,
datetime TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
value float DEFAULT NULL,
PRIMARY KEY (id));

DELIMITER $$
CREATE PROCEDURE load_renato()
BEGIN
  DECLARE i INT DEFAULT 0;
  WHILE i < 100000 DO
    INSERT INTO renato (datetime,value) VALUES (
      FROM_UNIXTIME(UNIX_TIMESTAMP('2023-07-01 01:00:00')+FLOOR(RAND()*31536000)),
      ROUND(RAND()*100,2));
    SET i = i + 1;
  END WHILE;
END$$
DELIMITER ;

```

Finally, we will call the procedure on both databases, Remember: default configuration, same region, same class, same size. No networking is involved. No magic. No tricks.

```
# Aurora

mysql> call load_renato;
Query OK, 1 row affected (5,41 sec)

mysql> select count(*) from renato;
+----------+
| count(*) |
+----------+
| 100000 |
+----------+

# RDS

mysql> call load_renato;
Query OK, 1 row affected (5 min 20,41 sec)

mysql> select count(*) from renato;
+----------+
| count(*) |
+----------+
| 100000 |
+----------+

```

The results are striking: Amazon Aurora outperforms RDS significantly, completing the task in just 5.4 seconds compared to RDS’s 5 minutes and 20 seconds. This remarkable 60x difference clearly demonstrates the superiority of Aurora in this specific scenario.

WOW, you are kidding me!

![Write IOPS, very different range](https://cloudiamo.com/wp-content/uploads/2023/07/Screenshot-from-2023-07-26-08-33-43-1024x414.png)

Just remember this simple test every time you read “50% faster”, “47% faster and costing up to 43% less” or “127% better IOPS”.  This benchmark serves just as a reminder that real-world tests are crucial in understanding the true capabilities of a database.

As they used to say, there are three kinds of lies: lies, damned lies, and ~~statistics~~ database benchmarks.