NyProtect your database from future fires to avoid high-scale capital loss at your Series A stage
Ny
Miaro ny angon-drakitra anao amin'ny afo amin'ny hoavy mba hisorohana ny fahaverezan'ny vola avo lenta amin'ny dingana Series A
Disclaimer: Ireto manaraka ireto dia fikarohana tranga ampiasaina mba hampahafantarana ny fomba fanao tsara indrindra amin'ny famolavolana fandaharam-potoana MongoDB, famolavolana ny fahombiazana, ary ny fanatsarana ny vidiny
NyDisclaimer: The following is a fictional case study used to communicate best practices for MongoDB schema design, performance tuning, and cost optimization
Ny andro nahatongavan'ny baiko nokleary
Ny antso dia tonga amin'ny2:17Ny
Ny Atlas dia nahatonga ny famokarana cluster tsy ara-drariny iray hafa izay niterakaM60Ny milina amin'ny vidiny isam-bolana$15kTiany ho fantatra ny antony nahatonga ny fandoroana niakatra tamin'ny 20% raha M60 dia miasa toy ny lafo vidy.$15 k/monthNy rafitra.
I opened the profiler:
db.system.profile.aggregate([
{ $match: { millis: { $gt: 100 } } },
{ $group: {
_id: { op: "$op", ns: "$ns", query: "$command.filter" },
n: { $sum: 1 },
avgMs: { $avg: "$millis" }
}},
{ $sort: { n: -1 } }, { $limit: 10 }
]).pretty();
Ny widget dashboard tsirairay dia nangatahana ny mpanohitra mba handroso amin'ny total1.7 GBNy habetsaky ny fampiasana fahatsiarovana no namorona ny tendrombohitra tao amin'ny grafika izay nahatsikaritra an'i Everest.
Ny mpizara M30 amin'izao fotoana izao dia miasa amin'ny iray amin'ireto clusters ireto. Ny vahaolana dia tsy miteraka fitomboan'ny fako.shape crimesNisy tao amin'ny codebase talohan'ny fanesorana.
Fanadihadiana momba ny heloka bevava
2.1 N + 1 Tezitra Tsunami
Izany dia fantatra amin'ny anarana hoe anti-pattern—raha ny fametrahana vondrona iray amin'ny baiko dia mitaky ny hanatanterahana fanontaniana samihafa N mba hahazoana andininy baiko.
// Incorrect: Orders + 1 000 extra queries
const orders = await db.orders.find({ userId }).toArray();
for (const o of orders) {
o.lines = await db.orderLines.find({ orderId: o._id }).toArray();
}
Hidden taxes
Ny solosaina
1 000 cursors = 1 000 fifanakalozan-kevitra
Ny fametrahana ny I / O
1 000 mpandehandeha index + 1 000 deserializations dok
Ny metatra
Ny metatra
Nahoana no miteraka
Nahoana no miteraka
1 000 cursors = 1 000 fifanakalozan-kevitra
Ny solosaina
Compute
1 000 cursors = 1 000 fifanakalozan-kevitra
1 000 cursors = 1 000 context switches
Ny fametrahana ny I / O
Storage I/O
1 000 mpandehandeha index + 1 000 deserializations dok
1 000 mpandehandeha index + 1 000 deserializations dok
Network
Isaky ny fialan-tsasatra dia mihinana ~1 ms RTT + TLS handshake overhead
Isaky ny fialan-tsasatra dia mihinana ~1 ms RTT + TLS handshake overhead
Refactor (4 lines):
// Success: Single round‑trip, 1 read unit per order
db.orders.aggregate([
{ $match: { userId } },
{ $lookup: {
from: "orderLines",
localField: "_id",
foreignField: "orderId",
as: "lines"
}},
{ $project: { lines: 1, total: 1, ts: 1 } }
]);
Nihena ny fahatarana p95 avy amin'ny 2300 ms ho 160 ms.
2 300 eo ho eo160 taonaAo amin'ny Reading-ops101 → 1.Izany dia 99% - tsy ilaina ny code coupon.
Ny fampiasana ny Unbounded Query Firehose
“Fa tsy maintsy mampiseho ny tantaran'ny tsindrio feno izahay!”
Ny“Fa tsy maintsy mampiseho ny tantaran'ny tsindrio feno izahay!”
Mazava ho azy fa tsy amin'ny tsindry iray ihany.
// Failure: Streams 30 months of data through the API gateway
db.events.find({ userId }).toArray();
Fix: hard-cap ny batch sy ny tetikasa fotsiny ny sehatra izay manolotra.
db.events.find(
{ userId, ts: { $gte: ISODate(new Date() - 1000*60*60*24*30) } },
{ _id: 0, ts: 1, page: 1, ref: 1 } // projection
).sort({ ts: -1 }).limit(1_000);
Avy eo dia avelao ny Mongo mamonjy ny rantsan-tananao:
// 90‑day sliding window
db.events.createIndex({ ts: 1 }, { expireAfterSeconds: 60*60*24*90 });
Ny mpanjifa iray amin'ny fintech dia namoaka ny vidiny amin'ny fitehirizana 72 isan-jato tamin'ny alina amin'ny alàlan'ny fampidirana TTLs.
NyNy mpanjifa iray amin'ny fintech dia namoaka ny vidiny amin'ny fitehirizana 72 isan-jato tamin'ny alina amin'ny alàlan'ny fampidirana TTLs.
2.3 Jumbo-Document vola pit
Mongo manapaka ny antontan-taratasy amin'ny 16 MB, fa na inona na inona mihoatra noho ny 256 KB dia renivohiny.
{
"_id": "...",
"type": "invoice",
"customer": { /* 700 kB */ },
"pdf": BinData(0,"..."), // 4 MB binary
"history": [ /* 1 200 delta rows */ ],
"ts": ISODate()
}
Why it hurts
- Ny
- Ny dokotera manontolo dia voasoratra amin'ny pejy, na dia mamaky sehatra iray aza ianao.
- Ny WiredTiger dia tsy afaka mitahiry dokam-barotra maro isaky ny pejy → ambany ny tahan'ny hitany amin'ny cache. Ny
-
Index entries are huge → bloom filter misses → more disk seeks.
Ny
SolutionNy :schema‑by‑access‑pattern:
graph TD
Invoice[(invoices<br/><2 kB)] -->|ref| Hist[history<br/><1 kB * N]
Invoice -->|ref| Bin[pdf‑store (S3/GridFS)]
Ny metas amin'ny faktiora kely dia mitoetra; Ny BLOBS ao amin'ny S3 dia mandoa $ 0,023 / GB-taona fa tsy ny NAND-grade Atlas SSDs.
NyNy metas amin'ny faktiora kely dia mitoetra; Ny BLOBS ao amin'ny S3 dia mandoa $ 0,023 / GB-taona fa tsy ny NAND-grade Atlas SSDs.
Four More Shape Crimes You’re Probably Guilty Of
- Low‑cardinality index head (
{ type: 1, ts: -1 }
)—re‑order it to{ userId: 1, ts: -1 }
. Ny - $regex dia manomboka amin'ny sehatra tsy voamarina - fanadihadiana amin'ny string avy amin'ny afobe.
- findOneAndUpdate seat—document‐level locking bottleneck; mampiasa Redis/Kafka. Ny
- skip + large offset pagination—Mongo must count every skipped doc; switch to range (ts, _id) cursors.
Ny anatomy amin'ny vidiny 101
“But Atlas says reads are cheap!”
Ny“Fa ny Atlas milaza fa lafo ny famakiana!”
Aoka isika hanao ny matematika.
Ny metaly |
Ny lanjany |
Ny vidin'ny |
Monthly cost |
---|---|---|---|
Ny vokatra (150 / s) |
380 M | NyNy $0.225 / M | NyNy $86 |
Data transfer | Ny 1.5 TB | Ny
$0.25 / GB | Ny
$375 | Ny
Storage (2 TB) | Ny
|
Ny vidiny dia 0.24 / GB. | NyNy $480 |
Ny vidiny dia 0.24 / GB.
Ny metaly
Ny lanjany
Ny vidin'ny
Ny vidin'ny
Ny vidiny isam-bolana
Mifototra amin'ny 3 k/s
8 B ny
7.8 B
$0.09 / M
Ny vidiny dia 0.09 / m.
$702
$702
Ny vokatra (150 / s)
380 metatra
Ny vidiny dia 0.225 / m.
Ny vidiny dia 0.225 / m.
$86
$86
Ny famindrana
Ny famindrana
1.5 TB
Ny habetsaky ny 1.5 TB
Ny vidiny dia 0.25 / GB.
$375
$375
Ny vidiny dia 0.24 / GB.
Ny fitehirizana dia 2 TB.
Ny vidiny dia 0.24 / GB.
Ny vidiny dia 0.24 / GB.
$480
Ny manontolo:$1,643.
Ampiasao ny fikarakarana:
- Ny
- Ny vidiny dia mihena 70 % → $210 Ny
- Ny fandoavam-bola dia mihena 80% → $ 75 Ny
- Ny fitehirizana dia mihena 60% → $192 Ny
Ny volavolan-dalàna vaovao: $ 564. Izany dia iray amin'ireo injeniera eo anelanelan'ny sehatra na lalana ho any amin'ny Q4 - misafidy.
NyNew bill: $564. That’s one mid‑level engineer Aryfitaterana ho any amin'ny Q4 - ianao no misafidy.
48-hour Rescue Sprint (fandresena ny fotoana)
30 ny 36
Add Grafana panels: cache hit %, scan:ix ratio, eviction rate.
Ny Prometheus
Ny ora
Ny ora
Action
Ny hetsika
Ny fitaovana
Ny fitaovana
Ny fandresena
Ny fandresena
0 ny 2
Miverina amin'ny profil (slows = 50)
Turn on profiler (slowms = 50
Ny
Ny Shell
Ny Shell
Ny Surface Top 10 dia miakatra amin'ny fotoana fohy.
Rewrite N + 1 into $lookup
.
2 ny 6
Manoratra indray ny N + 1 ao amin'ny $lookup.
Rewrite N + 1 into $lookup
.
VS Code + Jest tests
VS Code + Jest fanandramana
90 isanjaton'ny olona tsy mahazo mamaky.
90 isanjaton'ny olona tsy mahazo mamaky.
6 ny 10
6‑10
Add projections & limit
to unbounded finds.
Add projections & limit
to unbounded finds.
Ny afo dia
RAM tsy tapaka; API 4x haingana kokoa.
RAM tsy tapaka; API 4x haingana kokoa.
10‑16
Break jumbo docs → metas + GridFS/S3.
Ny famoahana ETL
Miasa amin'ny fametrahana ny RAM.
Drop / hanolo ny ambany-cardinality indices.
Ny Compass
16‑22
16 ny 22
Drop / hanolo ny ambany-cardinality indices.
Drop / hanolo ny ambany-cardinality indices.
Ny Compass
Compass
Disk shrinks; cache hits ↑.
Disk shrinks; cache hits ↑.
22 ny 30
Mamorona TTLs, volana-partition cold data, mamela Online Archive.
Create TTLs, month‑partition cold data, enable Online Archive.
Ny Atlas dia
60 % storage saved.
60 % storage saved.
30 ny 36
Add Grafana panels: cache hit %, scan:ix ratio, eviction rate.
Ny Prometheus
30‑36
30 ny 36
Add Grafana panels: cache hit %, scan:ix ratio, eviction rate.
Ampidiro ny grafana: Cache hit %, scan:ix ratio, tahan'ny fanesorana.
Ny Prometheus
Prometheus
Visual early warnings.
Ny fampitandremana haingana.
36‑48
36 - 48 taona
Load‑test with k6
Load‑test with k6
k6 + Atlas metriky
k6 + Atlas metriky
Ataovy azo antoka fa p95 < 150 ms @ 2× loading.
Ataovy azo antoka fa p95 < 150 ms @ 2× loading.
Tsindrio ny lisitry ny fanaraha-maso - Pin It Above Your Desk
-
Largest doc ÷ median > 10? → Refactor.
Ny - Ny Cursor dia miverina > 1000 docs? → Paginate. Ny
- TTL eo amin'ny sehatry ny hetsika / fivarotana rehetra? (Eny / Tsy) Ny
-
Any index where cardinality < 10 %? → Drop/re‑order.
Ny - Profile slowops > 1 % total ops? → Optimize na Cache.
If primary cache hits remain under 90% it is wise to separate collections or add additional RAM memory post fixes.
Place the checklist on your laptop with adhesive glue after laminating it for printing.
Nahoana ny Shape Beats Indices?
Ny mpandrindra fanontaniana ao amin'ny MongoDB dia manao fikarohana mifototra amin'ny vidiny eo amin'ny drafitry ny kandidà.
workUnits = ixScans + fetches + sorts + #docs returned
Ny indices dia mampihenaixScans
Ny endrika ratsy dia inflatesfetchesArysortsIndraindray dia mitovy amin'ny ankamaroan'ny mpitarika. ohatra:
db.logs.find(
{ ts: { $gte: start, $lt: end }, level: "error" }
).sort({ level: 1, ts: -1 });
Ny indices{ level: 1, ts: -1 }
Tsy manampy ny Planner mba hisorohana ny antontan-taratasy tsirairay rehefa manampy predicate ho an'ny sehatra tsy voalaza ao amin'ny sehatra array ao amin'ny famaritana. Net vokatra: 20 k famaritana ho an'ny 200 hits. Indices tokony mialoha ny endrika asa amin'ny asa isan'andro.
Live Metrics ianao tokony hijery (Grafana PromQL)
# WiredTiger cache hit ratio
(rate(wiredtiger_blockmanager_blocks_read[1m]) /
(rate(wiredtiger_blockmanager_blocks_read[1m]) +
rate(wiredtiger_blockmanager_blocks_read_from_cache[1m]))
) < 0.10
Ataovy azo antoka raha > 10 % miala 5 m.
# Docs scanned vs returned
rate(mongodb_ssm_metrics_documents[1m]{state="scanned"}) /
rate(mongodb_ssm_metrics_documents[1m]{state="returned"}) > 100
If you scan 100× more docs than you return, you’re burning money.
If you scan 100× more docs than you return, you’re burning money.
Hands-On: Thin-Slice Migration Script amin'ny alàlan'ny famerenana
Need to crack a 1‑TB events
Ny fanangonana aoclicks
Nyviews
Nylogins
without downtime? Use the double‑write / backfillNy Pattern.
// 1. Add trigger
const changeStream = db.events.watch([], { fullDocument: 'updateLookup' });
changeStream.on('change', ev => {
const dest = db[`${ev.fullDocument.type}s`];
dest.insertOne({ ...ev.fullDocument });
});
// 2. Backfill historical in chunks
let lastId = ObjectId("000000...");
while (true) {
const batch = db.events.find({_id: {$gt: lastId}}).sort({_id: 1}).limit(10_000);
if (!batch.hasNext()) break;
const docs = batch.toArray();
docs.forEach(d => db[`${d.type}s`].insertOne(d));
lastId = docs[docs.length - 1]._id;
}
Zero downtime, minimal extra storage (thanks to TTL), everyone sleeps.
When Sharding Is the Answer
According to the rule of thumb you should shard only if you verify oneIreo fepetra ireo dia mitranga aorian'ny fanatsarana ny angon-drakitrao:
- Ny
- Ny rafitra dia miasa amin'ny rafitra miasa mihoatra ny 80 isan-jato amin'ny RAM, na inona na inona ny fahombiazan'ny fahombiazan'ny cache.
-
The system generates more than 15 thousand operations per second in its peak write performance when using one primary server.
- Ny lanjanao voalohany dia ny fitazonana ny fihenan'ny faritra maro latsaky ny 70 millisecond satria ny vidin'ny fandoavam-bola avo lenta amin'ny AWS dia tsy mahaliana anao.
The decision should be simple when the conditions do not match these rules.
Ny fanadihadiana momba ny raharaha Wrap-Up
Taorian'ny
Metric
Ny metaly
Before
After
Taorian'ny
Ny Δ
Ny Δ
Ny lalan'ny RAM
Ny lalan'ny RAM
120 GB
120 GB
36 GB amin'ny
Ny 70 isan-jato
Ny 70 isan-jato
Ny 900
Ny mpamaky / Sec
Ny mpamaky / Sec
Ny 6 700
Ny 6 700
Ny 900
Ny 900
86 isan-jato ny
600 GB
71 isan-jato
Storage (hot)
Ny 2 TB
Ny 2 TB
Ny faha-600 GB
600 GB
71 isan-jato
−71 %
92 isan-jato ny
p95 latency
P95 ny faharetan'ny
1.9 s
140 taona
92 isan-jato ny
92 isan-jato ny
Atlas ny vidiny / mo.
79 isan-jato
Atlas ny vidiny / mo.
Atlas ny vidiny / mo.
Ny vola dia 15 284 dolara.
Ny vola dia 3 210.
79 isan-jato
79 isan-jato
Tsy misy tsikelikely, tsy misy fihenan'ny code lehibe, fotsiny ny fametrahana ny endrika tsy ara-drariny.
Tsy misy tsikelikely, tsy misy fihenan'ny code lehibe, fotsiny ny fametrahana ny endrika tsy ara-drariny.
Tombontsoa ho an'ny tsy fahampian-tsakafo - Debt vs. Death Spiral
Ny fepetra hanome haingana dia manan-danja, fa ny fitazonana asa tsy misy kalitao dia ampahany amin'ny fanangonana trosa tsy ara-drariny. Ny mpamatsy Cloud dia mandoa tombontsoa ho anao izay mandany amin'ny tahan'ny isan-taona 1000% amin'ny trosa tsy nahazoan-dalana. Nanadihady ny karatra fampindramam-bola avo lenta avy amin'ny MongoDB satria izy ireo dia maneho ny heloka bevava dimy izay nianatra izahay. Ny fanesorana ireo trosa ireo ao anatin'ny vanim-potoan'ny sprint amin'izao fotoana izao dia hiteraka tatitra ara-teknika sy ara-bola mahatsikaiky.
Tsy maintsy misokatra ny mombamomba mba hiasa amin'ny$lookup
ny pistons raha manampy TTL vovoka, ary avy eo mampiasa ny tetikasa amin'ny fomba lean. Ny biraonao sy ny ekipa developer sy ny pager amin'ny 02:17 dia hahazo fialan-tsasatra tsara.
Mandeha amin'ny refactoring ny code mandra-pahatongan'ny manaraka autoescaling zava-nitranga.