Domain 3 of 4 · Chapter 3 of 5

High-Performing Databases

Aurora vs RDS: feature-by-feature breakdown

Aurora commits every write to six storage nodes across three AZs before it acknowledges; RDS writes to one EBS volume and ships a copy to a passive standby. That single split in the storage layer is where the whole Aurora-versus-RDS answer lives, and almost every scenario stem (sub-100 ms replica lag, ~1 minute failover, backtrack, cloning) traces straight back to it. Aurora is RDS's cloud-native cousin, MySQL- and PostgreSQL-compatible at the wire level, but the engine underneath is a different machine, and the exam tests when that machine earns its keep and when plain RDS suffices.

Storage architecture (the one difference everything else follows from; the figure below shows both topologies):

HA and failover:

  • RDS Multi-AZ: 60-120 sec failover. Standby NOT readable.
  • RDS Multi-AZ DB cluster (newer for MySQL/PostgreSQL): 1 writer + 2 readable standbys across 3 AZs. ~35 sec failover.
  • Aurora: 1 writer + up to 15 readers. Reader can auto-promote on writer failure (~1 min). All readers are read-only but accessible.

Replication lag:

  • RDS Read Replicas: async; lag from seconds to minutes under heavy writes.
  • Aurora Replicas: shared storage means typical < 100 ms lag (often < 10 ms).

Storage features unique to Aurora:

  • Backtrack[12] (MySQL only): rewind cluster up to 72 hours in-place (no restore). For "oops, dropped a table" scenarios.
  • Cloning: instant zero-copy clones using copy-on-write storage. Use for dev/test branches off production data.
  • Aurora Global Database: cross-region replication < 1 s RPO; managed promote ~1 min RTO.
  • Aurora Serverless v2[13]: ACU-based autoscaling in 0.5-ACU increments (0 → 256 ACUs on current engine versions[20]; a 0 minimum enables automatic pause; older versions capped at 0.5 → 128). An ACU (Aurora Capacity Unit) is Aurora's unit of combined compute-plus-memory capacity.
  • Parallel Query (MySQL): pushes WHERE/aggregation down to the storage layer for analytical queries on transactional data.
  • Aurora I/O-Optimized: switch billing modes (pay more for compute, zero per-I/O). Break-even at ~25% I/O of total Aurora cost.

Storage features unique to RDS:

  • Other database engines: Oracle, SQL Server, MariaDB (only RDS supports these). Aurora is MySQL/PostgreSQL only.
  • Database-specific tuning knobs: more direct parameter-group control over engine internals.

(Stop/start instance, up to 7 days, pay storage only, is not unique to either side: you can pause RDS or Aurora alike.)

Cost:

  • RDS: hourly instance + EBS storage + I/O charges.
  • Aurora Standard: hourly instance + storage + per-I/O charges.
  • Aurora I/O-Optimized: ~30% more compute cost; zero per-I/O.
  • Aurora Serverless v2: per-ACU-hour pricing.

Decision pattern:

  • New MySQL or PostgreSQL workload → Aurora (default).
  • Need Oracle / SQL Server / MariaDB → RDS.
  • Variable / unpredictable load → Aurora Serverless v2.
  • Need < 100 ms read replica lag → Aurora.
  • Need cross-region RPO < 1 s → Aurora Global Database.
  • Need backtrack / cloning → Aurora.
  • Tiny workload (< 1 vCPU) where Aurora minimum ($0.10/ACU-hr) is too high → RDS t3.micro etc.
  • Legacy app with specific Oracle/SQL features → RDS for those engines.
RDS — instance-to-instance primary (EBS) synchronous async standby (another AZ) NOT readable read replicas lag: seconds to minutes Multi-AZ failover: 60-120 sec Aurora — shared storage writer up to 15 readers writes reads: < 100 ms lag shared storage layer 6 storage nodes across 3 AZs auto-scales 10 GB → 256 TiB
RDS replicates instance-to-instance (standby + async replicas); Aurora's writer and readers all attach to one shared storage layer: 6 storage nodes across 3 AZs.

DynamoDB partition design: key shapes, GSI patterns, adaptive capacity

DynamoDB's performance depends entirely on partition key design. A poorly-distributed key creates hot partitions that throttle writes regardless of total provisioned capacity. This section gives you the key-shape rules that prevent that. The figure above shows the hierarchy those rules govern: a table's items fan out across partitions by hash(partition_key), and within each partition the sort key orders items.

Partition basics:

  • Items physically distributed across partitions by hash(partition_key).
  • Each partition supports up to 3 000 RCU + 1 000 WCU (read and write capacity units, DynamoDB's per-second throughput currency; figures apply in provisioned mode).
  • A single hot key consuming > 1 000 WCU throttles even if the table has 100 000 WCU provisioned.

Adaptive capacity[16] (since 2018):

  • DynamoDB auto-shifts capacity TO hot partitions FROM cold ones in the same table.
  • Works at the partition level, not the key level. Still bounded by per-partition limits.
  • Doesn't eliminate hot-key problems for low-cardinality partition keys.

Key cardinality matters:

  • High-cardinality partition key (UUIDs, customer IDs, order IDs): writes distribute evenly. No hot partition issues.
  • Low-cardinality key (e.g. "tenantType" with values "premium" and "basic"): all writes hit 2 partitions max. Throttled at 1 000 WCU each → 2 000 WCU table-wide ceiling.

Composite keys (the common pattern):

Use partition_key + sort_key. The partition key shards; the sort key orders within a partition.

  • Partition key = userId → all that user's items live in one partition.
  • Sort key = timestamp → query "most recent N items for this user" via Query with ScanIndexForward=false, Limit=N.

Write sharding for very hot logical keys:

If one user generates 10 000 writes/sec (above 1 000 WCU partition limit), shard the key:

  • Use userId#0..N as partition key (where N is a fixed bucket count).
  • Writes randomly pick a bucket; reads query all N partitions.
  • Trades write hot-partition for fan-out reads.

Global Secondary Indexes (GSI):

  • Index with a DIFFERENT partition key + (optional) sort key than the base table.
  • Eventually consistent reads (typically sub-second lag).
  • Has its own RCU/WCU provisioning (or on-demand), separate from the base table.
  • Up to 20 GSIs per table.
  • Use for: query patterns that aren't supported by the base table's keys (e.g. base table is by orderId, GSI is by customerId to look up all orders for a customer).

Local Secondary Indexes (LSI):

  • Index with the SAME partition key as base table but different sort key.
  • Strongly consistent reads supported.
  • Must be created at table-creation time (can't add later).
  • Counts against the 10 GB per-partition-key item collection limit.
  • Rarely the right answer on the exam: usually GSI fits better.

DynamoDB Streams[18] (change capture):

  • 24h retention.
  • Stream record options: KEYS_ONLY, NEW_IMAGE, OLD_IMAGE, NEW_AND_OLD_IMAGES.
  • Consumer pattern: Lambda triggered by stream → react to changes (audit, propagate to OpenSearch, invalidate cache).
  • Enables DynamoDB Global Tables under the hood (multi-region multi-active).

TTL (time-to-live):

  • Auto-delete items after a timestamp (specified in an item attribute).
  • Deletes are best-effort (typically within 48h of TTL).
  • Free deletes (don't consume WCU).
  • Use for: session tables, time-limited tokens, log cleanup.
DynamoDB table items keyed by partition + sort key hash(partition_key) selects a partition partition A max 3 000 RCU / 1 000 WCU partition B max 3 000 RCU / 1 000 WCU partition C max 3 000 RCU / 1 000 WCU sort key orders items within a partition items, ordered by sort key userId#42 | 2026-06-01 userId#42 | 2026-06-02 userId#42 | 2026-06-03
DynamoDB partition hierarchy: hash(partition_key) selects a partition (each capped at 3 000 RCU / 1 000 WCU), and the sort key orders items within it.

DAX setup: VPC config, cluster sizing, write-through semantics

DAX (DynamoDB Accelerator)[15] is a write-through cache in front of DynamoDB. Reads through DAX = microseconds (vs single-digit ms direct). Sits in your VPC. This section covers when DAX beats a generic cache, how a cluster is laid out, and the consistency trade-off you accept for the speed.

Why DAX over ElastiCache for DynamoDB caching (ElastiCache is AWS's managed Redis/Memcached service; the next section's topic):

  • DynamoDB-native API: code uses the standard DynamoDB SDK with the DAX endpoint. No application changes beyond endpoint swap.
  • Write-through built-in: writes go to DAX AND DynamoDB; cache stays consistent.
  • No cache-invalidation logic: DAX handles it.
  • vs ElastiCache: ElastiCache requires custom application code to fetch from DynamoDB on miss + populate cache + invalidate on writes. More flexible but more code.

Architecture (the figure below traces the three request paths):

  • DAX cluster = 1 primary node + 0-9 read replicas across multiple AZs.
  • Primary handles writes (write-through to DynamoDB); replicas serve reads.
  • Up to 10 nodes per cluster. Sizing example: 1 primary + 2 replicas across 3 AZs.

Cache modes:

  • Item cache: caches individual items by primary key. TTL configurable (default 5 min). LRU eviction.
  • Query cache: caches Query and Scan results. TTL configurable (default 5 min).

Eventual consistency by default. DAX reads return potentially stale data (from cache). For strongly-consistent reads, configure the request to bypass DAX and go directly to DynamoDB.

Setup steps:

  1. Create DAX cluster: pick node type (e.g. dax.r5.large), node count, VPC + subnets.
  2. Create a subnet group spanning multiple AZs.
  3. Create an IAM role for DAX nodes (allows access to underlying DynamoDB tables).
  4. Set up security group: allow port 8111 (DAX cluster comm).
  5. Update application: install DAX SDK; point DynamoDB client at DAX cluster endpoint.

Latency impact:

  • Cached read: ~1 ms (within VPC). That's the end-to-end round trip including the network hop; the cache itself answers in the microseconds quoted above.
  • Cache miss: DAX fetches from DynamoDB (single-digit ms), populates cache, returns.
  • Cached write: write-through to DynamoDB + cache update (~few ms).

Cost:

  • DAX nodes priced like EC2 instances ($/hr).
  • Per-node sizing matters (but replicas hold copies of the primary's cached data[21], so effective cache capacity ≈ one node's RAM; adding nodes scales read throughput and availability, not cache size).
  • Magnitude check against current DAX pricing[22]: a small 3-node cluster of mid-size nodes runs hundreds of dollars a month; a large 10-node cluster of big instances costs tens of times more.

When DAX is the right answer:

  • Read-heavy DynamoDB workload (>80% reads).
  • Hot keys generating GetItem traffic.
  • Microsecond read latency required.
  • Workload can tolerate eventual consistency.

When NOT:

  • Write-heavy workload. DAX doesn't help; writes always go to DynamoDB.
  • Strong-consistency reads required. DAX bypasses cache for those.
  • Small workload. ElastiCache or direct DynamoDB is cheaper.
  • Workload uses Transaction APIs heavily. TransactGetItems / TransactWriteItems bypass DAX.

Compared to DynamoDB built-in caching:

  • DynamoDB has no built-in cache at the API layer (the storage engine has its own internal cache, but it's not exposed).
  • DAX is the supported caching solution. Custom ElastiCache + cache-aside is an alternative for finer control.

Common exam scenarios:

  • 'DynamoDB read latency too high' → DAX.
  • 'Microsecond reads against DynamoDB' → DAX.
  • 'Cache DynamoDB with minimal app changes' → DAX.
  • 'Cache DynamoDB with custom invalidation logic' → ElastiCache + custom code.
application DynamoDB SDK → DAX cluster endpoint DAX cluster 1 primary + 0-9 read replicas read — cache hit read — cache miss write served from cache microseconds fetch from DynamoDB single-digit ms, populates cache write-through to DynamoDB AND cache DynamoDB table
The three DAX request paths: cache hits answer from the cache in microseconds; cache misses and writes always reach the DynamoDB table.

ElastiCache: cluster mode, shard count, replica strategy

ElastiCache offers managed Redis and Memcached. Each has very different scaling and HA models. Picking wrong means you can't shard, or you can't replicate, or you're paying for features you don't need. The figure above contrasts the two Redis cluster modes that decide whether you can shard at all: a single shard versus data spread across many shards by hash slot.

Redis cluster modes:

Cluster Mode Disabled (single-shard):

  • 1 primary node + 0-5 replicas (read-only).
  • Single shard → all data on one node.
  • Failover: replica auto-promotes (~1 min).
  • Max RAM: limited by largest available node type.
  • Use for: small workloads where total dataset fits on one node + need replicas for read scaling or HA.

Cluster Mode Enabled (sharded):

  • 1-500 shards; each shard is 1 primary + 0-5 replicas.
  • Data partitioned across shards by hash slot (16 384 slots distributed across shards).
  • Total cluster capacity = shard count × per-shard RAM.
  • Failover: per-shard, automatic.
  • Use for: larger datasets, write-scaling workloads, very-high-throughput.

Redis Serverless (newer):

  • Auto-scales ECPUs and storage independently.
  • Multi-AZ HA built-in.
  • No node management.
  • Trade-off: less control over individual node placement.

Memcached:

  • No replication; no persistence.
  • Multi-threaded per node (one node uses all cores; Redis is single-threaded with side processes).
  • Auto-discovery: clients auto-discover all nodes in the cluster.
  • Use for: simple key-value caching where lost data is acceptable.
  • Wrong for: anything needing data structures (Redis lists/sets/sorted sets), persistence, or replication.

Redis vs Memcached (the canonical exam question; AWS's own comparison[17]):

Feature Redis Memcached
Data structures Strings, lists, sets, sorted sets, hashes, streams, geo, hyperloglog Strings only
Persistence Optional (snapshot + AOF) None
Replication Yes (read replicas, multi-AZ) No
Cluster mode (sharding) Yes Manual via client-side hashing
Pub/sub Yes No
Transactions Yes (MULTI/EXEC) No
Multi-threading Single-threaded (per node) Multi-threaded
Snapshots / backups Yes No

Default answer: Redis unless the question explicitly says 'simple multi-threaded caching'.

Caching strategies (applies to both):

  • Lazy loading: read miss → fetch from DB → cache. Cache only holds requested data. Stale data possible (until TTL).
  • Write-through: every write goes to cache AND DB. The same semantics DAX applies natively (previous section). Always fresh; slower writes; cache may hold rarely-read data.
  • Write-around: writes go to DB only; cache populated on read miss. Reduces cache pollution from write-heavy workloads.
  • TTL-based expiration: time-bounded staleness regardless of strategy.

Common patterns:

  • Session store (Redis): Cluster Mode Disabled with replication for HA; persistence on (RDB + AOF).
  • Leaderboard (Redis): Cluster Mode Enabled with sharding for write scaling; uses sorted sets.
  • Database read cache (Redis or Memcached): cluster mode for scale; lazy-loading; short TTL.
  • Geo-spatial queries (Redis only): GEOADD + GEORADIUS commands.

Reserved Nodes:

  • 1- or 3-year commitment for ~30-55% discount (similar to EC2 RIs).
  • All-Upfront / Partial-Upfront / No-Upfront payment options.
  • Used after running on-demand for ~30 days to verify the right node type.
Cluster Mode Disabled single shard 1 shard (all data) primary 0-5 replicas replica auto-promotes on failover Cluster Mode Enabled 1-500 shards by hash slot 16 384 hash slots shard 1 primary + 0-5 rep shard N primary + 0-5 rep capacity = shards x per-shard RAM
The two Redis cluster modes: Cluster Mode Disabled is one shard (1 primary + 0-5 replicas); Cluster Mode Enabled spreads data across 1-500 shards by hash slot.

Database services by access pattern

ServiceData modelLatencyScaleBest for
Aurora (MySQL / PG)RelationalSingle-digit msUp to 256 TiB, 15 read replicasMost new OLTP workloads
RDS (engines)RelationalSingle-digit msUp to 64 TiB primary (SQL Server 16 TiB on gp3; up to 256 TiB total on Oracle/SQL Server with additional volumes); 15 read replicas (async; Oracle recommends ≤5)Oracle / SQL Server / MariaDB engines
DynamoDBKey-value / documentSingle-digit ms (μs with DAX)Effectively unlimitedKnown access patterns, single-key reads / writes
ElastiCache RedisKey-value in-memory + structuresSub-millisecondTB-scale clustersHot data caching, session store, leaderboards
ElastiCache MemcachedSimple key-value in-memorySub-millisecondMulti-node shardedSimple object caching (no persistence, no advanced types)
RedshiftColumnar MPPSeconds-minutesPetabyteData warehouse + BI
OpenSearchInverted index + JSONSingle-digit ms searchTB-scaleSearch + log analytics + observability
NeptuneGraph (Gremlin + SPARQL)Single-digit ms traversalBillions of edgesRecommendation, fraud, social graph
DocumentDBMongoDB-compatible documentSingle-digit msUp to 128 TiB cluster, 15 read replicasMongoDB workloads needing managed service
TimestreamTime-seriesMillisecond writesTrillions of pointsIoT, observability, monitoring data

Sharp facts the exam loves — give these one last read before exam day.

Cheat sheet

Sharp facts the exam loves — scan these before test day.

Pick the database engine by access pattern, not by data model

Database engine is chosen by how the data will be queried, not by the data model it superficially resembles, because the access pattern determines performance at scale. Use relational (RDS, Aurora) for transactions, joins, and ad-hoc queries; key-value (DynamoDB) for predictable single-item reads and writes at any scale; document (DocumentDB) for JSON-shaped data; and search (OpenSearch) for full-text. For specialized shapes the purpose-built engines win outright. Timestream for time-series and Neptune for graph traversal, because they index and store the data the way those queries actually walk it.

Trap Forcing every workload onto a relational engine just because the data looks like rows: full-text search, graph traversal, and at-scale key-value lookups all underperform on RDS compared to the engine built for them.

1 question tests this
Scale reads with replicas; scale writes with sharding

Reads and writes scale by different mechanisms, so match the fix to the bottleneck. Read replicas multiply read throughput by serving queries off copies: RDS gives up to 15 async Read Replicas per source, and Aurora Replicas go to 15 too but with typically <100 ms lag. Yet none absorb a single write. Because the single writer still caps write throughput, you scale writes by spreading them out: design DynamoDB partition keys for high cardinality and lean on adaptive capacity, or shard a relational workload across multiple Aurora clusters by tenant or key.

Trap Adding read replicas to fix a write bottleneck: they only absorb read traffic, so the single writer still caps how fast you can write.

1 question tests this
Default to Aurora unless you need stock RDS Oracle/SQL Server

Aurora is the default relational choice: wire-compatible with MySQL and PostgreSQL, it replaces RDS's single-volume storage with a distributed layer that keeps 6 copies across 3 AZs, fails over in under 30 s, and offers Aurora Serverless v2 for on-demand scaling. Its storage grows automatically[11] up to 256 TiB on current engine versions (128 TiB on older ones) with no manual resize, no downtime, and no provisioning, and because you pay only for what you use, dropping a table actually shrinks billed storage. Stay on stock RDS only when you specifically need the Oracle or SQL Server engine, which Aurora doesn't run.

Trap Assuming you must pre-provision Aurora storage and resize it later like classic RDS: Aurora scales storage on its own, so that capacity planning is wasted effort.

Need microsecond DynamoDB reads → put DAX in front

DAX[15] is a managed in-memory cache purpose-built for DynamoDB, the answer when single-digit-millisecond reads aren't fast enough: it returns cached reads in microseconds while writes pass straight through DAX to the table. It's read-through and write-through/write-around, eventually consistent by default, runs inside your VPC, and speaks the DynamoDB API itself, so your application points at DAX and the code barely changes. That API compatibility sets it apart from a generic cache, where you'd write and maintain the caching logic yourself.

Trap Reaching for ElastiCache to cache DynamoDB: DAX is the DynamoDB-native cache that speaks the same API, whereas ElastiCache leaves you to manage the cache-aside pattern yourself.

7 questions test this
Aurora replicas lag <100 ms (often <10 ms) via shared storage

Aurora replicas stay far fresher than RDS async replicas because of how they replicate: they read directly from the shared distributed storage layer[11] the writer already persisted to, rather than replaying a shipped binary log. Removing the log-shipping pipeline entirely puts replica lag typically under 100 ms and often under 10 ms. You can run up to 15 of them, the reader endpoint load-balances across the set, and on writer failure a replica is promoted in roughly a minute.

4 questions test this
DynamoDB throttling → fix the partition key cardinality first

DynamoDB throttling points first at partition key cardinality, because the table spreads its throughput across physical partitions by hashing that key. Adaptive capacity[16] automatically shifts capacity toward busy partitions and absorbs mild skew, but it can't rescue a low-cardinality key that funnels traffic onto one hot partition. Fix it at the source by choosing high-cardinality keys, UUIDs, hashes, or composite keys like tenant#item, so reads and writes fan out evenly instead of concentrating.

Trap Adding a GSI to relieve a hot partition: a GSI lets you query other attributes but does nothing for hot-key writes on the base table.

ElastiCache: default to Redis unless you only need simple multi-threaded caching

Between the two ElastiCache engines, Redis[17] is the default because it's far more than a cache: rich data structures (lists, sets, sorted sets, streams, geo, hyperloglog), plus pub/sub, persistence, replication, cluster-mode sharding, and transactions. Memcached is deliberately minimal (plain multi-threaded key-value with auto-discovery, no persistence and no replication) which gives it an edge only on simple, horizontally-scaled caching of opaque values. So pick Memcached when multi-threaded simple caching is the whole requirement, Redis for anything needing those richer capabilities.

Trap Picking Memcached when the requirement calls for persistence, replication, or sorted-set/pub-sub features. It has none of those, so it simply can't satisfy them.

17 questions test this
Need DynamoDB change-data-capture → enable DynamoDB Streams

DynamoDB Streams[18] is DynamoDB's built-in change-data-capture feed, the way to react to every insert, update, and delete: it captures each as an ordered, per-item sequence of stream records, with 4 view types (KEYS_ONLY, NEW_IMAGE, OLD_IMAGE, NEW_AND_OLD_IMAGES) so you choose how much of the before/after image you receive. The usual consumer is Lambda, which reacts to each change and fans it out downstream, and the same stream mechanism powers Global Tables' cross-region replication under the hood. Records are retained for 24 hours, which shapes how the consumer must be designed.

Trap Counting on Streams as durable event storage: records expire after 24h, so a consumer that's down longer permanently loses those changes.

Redshift joins: KEY co-locates large↔large; ALL replicates small dimensions

Redshift's distribution style decides where rows physically live across slices, and the goal is to avoid shuffling data over the network at join time. For a join between two large tables, set DISTSTYLE KEY on the shared join column in both so matching rows land on the same slice and Redshift skips redistribution. For a small, slowly-changing dimension (typically under a few million rows), use DISTSTYLE ALL to keep a full copy on every node, making joins on any column local without moving data. EVEN is the default and spreads rows blindly, so it's rarely best once you know your join patterns.

Trap Applying DISTSTYLE ALL to a large table: replicating a big table onto every node wastes storage and slows writes, so ALL is only for small dimension tables.

3 questions test this
To benefit from Aurora Auto Scaling, connect to the reader endpoint

Aurora Auto Scaling adds and removes read replicas with demand, but those replicas only receive traffic when clients connect through the reader endpoint rather than individual instance endpoints. The reader endpoint is a managed DNS name that round-robins connections across all available readers and automatically begins including a new replica once it passes health checks, so the capacity Auto Scaling provisions actually gets used. Point read traffic there and scaling is transparent; point it at fixed instance endpoints and the new replicas sit idle.

Trap Hard-coding instance-specific endpoints: the new replicas Auto Scaling spins up then receive no traffic, which defeats the whole point of scaling.

10 questions test this
"Oops, dropped a table" on Aurora MySQL → Backtrack rewinds in seconds

Aurora MySQL Backtrack[12] rewinds the existing cluster to a point up to 72 hours in the past, in seconds and without downtime, by moving the cluster back through its change records rather than restoring a backup. That makes it the fast recovery path for a logical mistake like a bad delete or accidental table drop, where the alternative (restoring from a snapshot or point-in-time) means provisioning a whole new cluster and waiting on it. Backtrack is Aurora MySQL only.

Trap Treating Backtrack like point-in-time restore: PITR provisions a separate new cluster from backups, whereas Backtrack reverts the existing cluster in place (and only on Aurora MySQL).

Put RDS Proxy in front of RDS/Aurora for serverless connection storms

When a Lambda fleet's per-invocation connections threaten to exhaust an RDS or Aurora instance's limited connection slots, put RDS Proxy in front: a fully managed connection pool between clients and the database. It reuses a small set of warm connections, queues or sheds excess requests instead of letting them overwhelm the DB, and shortens failover by keeping client connections open while it reconnects to a healthy instance. It reads the database credentials from AWS Secrets Manager and lets clients authenticate to the proxy with IAM, so no DB password sits in the function. Reach for a bigger instance or read replicas instead only when the bottleneck is real query load, not connection churn.

Trap Assuming RDS Proxy always multiplexes: session state such as a statement larger than 16 KB or a temporary table 'pins' a connection to one client, which drops back to one-connection-per-client and erases the pooling benefit.

Also tested in

References

  1. Amazon RDS User Guide
  2. What is Amazon Aurora? (chapter index)
  3. Amazon DynamoDB overview
  4. What is Amazon ElastiCache
  5. Amazon Redshift overview
  6. Amazon OpenSearch Service
  7. Amazon Neptune
  8. Amazon DocumentDB
  9. Amazon Timestream
  10. Amazon Aurora overview
  11. Aurora storage and reliability (6 copies, 3 AZs)
  12. Aurora Backtrack (Aurora MySQL)
  13. Aurora Serverless v2
  14. Aurora Global Database
  15. DynamoDB Accelerator (DAX)
  16. DynamoDB partition keys + adaptive capacity
  17. ElastiCache Redis vs Memcached
  18. DynamoDB Streams
  19. https://aws.amazon.com/blogs/database/readable-standby-instances-in-amazon-rds-multi-az-deployments-a-new-high-availability-option/
  20. https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-serverless-v2.setting-capacity.html
  21. https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DAX.concepts.html
  22. https://aws.amazon.com/dynamodb/pricing/on-demand/