How Instagram's Shard Key Choice Enabled 2 Billion Users
Shard Key Selection, database sharding, partition key, horizontal partitioning, consistent hashing, user_id sharding, distributed databases, query routing, hotspot prevention, and horizontal scalability are the core concepts behind Shard Key Selection: The Most Important Decision in Database Sharding. Selecting the right shard key determines how data is distributed across database servers, influences read and write performance, prevents uneven data distribution, and minimizes cross-shard queries. A well-chosen shard key enables applications to scale efficiently while keeping the majority of requests isolated to a single shard, making it one of the most critical architectural decisions in distributed database design.
Shard Key Evaluation Criteria:
Property What It Means Bad Example Good Example
--------------- ---------------------- ----------------- ----------------
High Cardinality Many unique values country (200) user_id (billions)
Even Distribution Similar load per shard celebrity_id (skew) hash(user_id)
Query Locality Most queries hit 1 shard created_at (range) tenant_id + time
Scoring your shard key (3-point scale):
Candidate Key Cardinality Distribution Locality Score
------------- ----------- ------------ -------- -----
user_id 3 2 3 8/9
tenant_id 2 2 3 7/9
hash(user_id) 3 3 2 8/9
country 1 1 2 4/9
created_at 3 1 1 5/9
auto_increment 3 1 1 5/9
(compound)
tenant+user_id 3 3 3 9/9Shard Key Strategies by Use Case
Common Application Patterns:
Use Case Shard Key Why
------------------- ----------------- ---------------------------
Social network user_id Feed, profile, DMs = single shard
Multi-tenant SaaS tenant_id Natural isolation per customer
E-commerce customer_id Order history on one shard
IoT / Telemetry device_id + time Per-device queries + time range
Chat application conversation_id All messages in one chat = one shard
Gaming guild_id / server Players on same game server = one shard
Ad platform advertiser_id Campaign analytics per advertiser
Compound Keys for Better Distribution:
Simple: tenant_id
Problem: enterprise tenant with 50% of data = hot shard
Compound: (tenant_id, user_id)
Large tenant data spreads across multiple shards.
Most queries include both tenant_id and user_id.
Queries with only tenant_id need scatter-gather (acceptable trade-off).Shard Key Antipatterns
Antipattern 1: Auto-Increment with Range Sharding
Shard 1: IDs 1-1M (cold - old data, rarely accessed)
Shard 2: IDs 1M-2M (cold)
Shard 3: IDs 2M-3M (HOT - all new writes go here!)
Fix: hash(ID) distributes evenly, OR use random UUIDs.
Antipattern 2: Low-Cardinality Key
Shard by country: 200 values max.
USA gets 40% of traffic = hot shard.
Canada gets 5% = mostly idle shard.
Fix: compound key (country + user_id_prefix).
Antipattern 3: Key Not in Most Queries
Shard by region but most queries are by user_id.
Every user query hits ALL shards (scatter-gather).
Fix: shard by the field in your WHERE clause.
Antipattern 4: Mutable Shard Key
Shard by user's home_city. User moves from NYC to SF.
All their data must physically migrate between shards.
Fix: use immutable keys (user_id, created_at).Re-Sharding: When You Chose Wrong
Re-sharding is the most painful database operation. It requires migrating data between shards while serving live traffic.
Consistent hashing reduces re-sharding impact - only K/N data moves (K=keys, N=shards) instead of reshuffling everything.
Virtual shards / logical partitions: shard into 256 logical partitions, map them to 4 physical servers. To add a server, just move some partitions.
Prevention: start with more logical partitions than physical servers. Growing from 4 to 8 servers is just remapping, not re-sharding.
Interview Tip
Shard key selection is a favorite interview topic because it reveals whether you think about access patterns before choosing infrastructure. Always ask: 'What are the primary query patterns?' Then choose the shard key that makes those queries single-shard. Walk through three properties: cardinality (enough values?), distribution (even load?), and query locality (most queries include the key?). Mention antipatterns proactively: auto-increment hot spots, low-cardinality skew, and mutable keys. The advanced insight: use compound keys (tenant_id + user_id) to get both isolation and even distribution. Mention consistent hashing for when re-sharding is needed.
Key Takeaway
The shard key determines your system's performance ceiling. Optimize for even distribution, high cardinality, and query locality. Most queries should include the shard key to avoid expensive scatter-gather. Choose based on your dominant access pattern - usually user_id or tenant_id. Use compound keys for better distribution and consistent hashing to minimize re-sharding pain.
