Scale Lab 2026: koliko brzo radi e-commerce baza s 10.000 do 5.000.000 artikala
Na sintetičkom katalogu od 5.000.000 artikala stranica proizvoda dolazi iz baze za 0,715 ms, prva stranica kategorije za 0,858 ms, a B2B cijena po kupcu za 24 artikla za 0,923 ms (medijani), gotovo jednako kao s 10.000 artikala (stranica proizvoda 0,687 ms).
Duboka paginacija keyset metodom na ~2000. stranici traje 0,691 ms, a ista stranica preko OFFSET-a 40,294 ms, oko 58× sporije.
Granica se pojavljuje kod brojača faceta: 102,491 ms medijan na 5.000.000 artikala s ovom shemom, što je točka na kojoj veličina kataloga postaje arhitektonska odluka.
Scale Lab 2026: sintetički katalog, PostgreSQL 16 u Docker Desktopu (WSL2) na jednom i7-13700K, jedan klijent na istom računalu, zagrijan cache, 24. rujna 2026. Mjereno je samo vrijeme upita do baze, bez učitavanja stranice. Bez usporedbe s drugim platformama.
Autor Filip Lukovnjak, osnivač i inženjerObjavljeno 24. rujna 2026.
- Veličine kataloga
- 10.000 · 100.000 · 1.000.000 · 5.000.000
- Mjerenja
- 300 po upitu i veličini
- Izmjereno
- 24. rujna 2026.
- Licenca podataka
- CC BY 4.0
01Ključni nalazi
Što raste s katalogom, a što ne
Svaka brojka ispod dolazi iz datoteke results.json, a uz nju stoji uvjet pod kojim vrijedi.
Stranica proizvoda · 5.000.000 artikala
medijan; 0,687 ms kod 10.000 artikala
0,715 ms
Prva stranica kategorije (24 artikla) · 5.000.000 artikala
medijan; ispod 1 ms na svim veličinama do 5 milijuna
0,858 ms
B2B cijena po kupcu za 24 artikla · 5.000.000 artikala
medijan
0,923 ms
Stranica ~2000 · 5.000.000 artikala
keyset paginacija vs OFFSET, medijan — oko 58× brže; iste retke provjerili smo na stranici ~200
0,691 ms vs 40,294 ms
Filtri, facete i pretraga · do 1.000.000 artikala
medijan (najsporije: brojanje faceta, 18,647 ms); p95 do 38,6 ms
ispod 20 ms
Brojanje faceta · 5.000.000 artikala
medijan (p95 236,328 ms) s ovom shemom — ovdje veličina kataloga postaje arhitektonska odluka; optimizacije u testu nisu primijenjene
102,491 ms
1.000 izmjena cijena i zaliha u jednoj transakciji · 1.000.000 artikala
medijan, oko 26.000 redaka/s; 20 serija; trošak ne raste ravnomjerno s veličinom kataloga
38,27 ms
5.000.000 artikala generirano, indeksirano i analizirano
podaci generirani u bazi, bez uvoza iz ERP-a; oko 2,9 GB s indeksima
130,73 s
Uvjeti mjerenjaScale Lab 2026: sintetički katalog, PostgreSQL 16 u Docker Desktopu (WSL2) na jednom i7-13700K, jedan klijent na istom računalu, zagrijan cache, 24. rujna 2026. Mjereno je samo vrijeme upita do baze, bez učitavanja stranice. Bez usporedbe s drugim platformama.
02Rezultati
Sve veličine, svi upiti
Graf prikazuje medijan za četiri reprezentativna upita. Tablice ispod sadrže p50 i p95 za svaki upit i svaku veličinu, učitane iz podataka pri izradi stranice.
- Stranica proizvoda
- Kategorija, 1. stranica
- Paginacija ~str. 200 (keyset)
- Brojači faceta
| Upit | 10.000 | 100.000 | 1.000.000 | 5.000.000 |
|---|---|---|---|---|
| Q0 · SELECT 1 — donja granica mreže i drivera | 0,537 / 0,82 | 0,417 / 0,572 | 0,402 / 0,576 | 0,466 / 0,658 |
| Q1 · Stranica proizvoda (slug + brend + kategorija) | 0,687 / 0,998 | 0,706 / 1,176 | 0,681 / 0,987 | 0,715 / 1,019 |
| Q2 · Kategorija, 1. stranica (24 artikla, po popularnosti) | 0,706 / 1,003 | 0,709 / 1,034 | 0,759 / 1,098 | 0,858 / 1,218 |
| Q3 · Paginacija ~str. 200, keyset | 0,645 / 1,059 | 0,589 / 0,815 | 0,72 / 1,072 | 0,69 / 0,973 |
| Q3 · Paginacija ~str. 200, OFFSET (antiobrazac) | 1,672 / 3,292 | 2,373 / 3,415 | 4,143 / 5,501 | 4,773 / 6,318 |
| Q3 · Paginacija ~str. 2000, keyset | n/p | 0,558 / 0,774 | 0,569 / 0,762 | 0,691 / 0,984 |
| Q3 · Paginacija ~str. 2000, OFFSET (antiobrazac) | n/p | 16,311 / 27,305 | 31,464 / 42,728 | 40,294 / 50,592 |
| Q4 · Filtriranje: podstablo, brendovi, cijena, zaliha, boja | 0,826 / 1,134 | 1,24 / 2,896 | 5,989 / 33,391 | 16,046 / 164,03 |
| Q5 · Brojači faceta (top 20 brendova) | 1,233 / 1,749 | 2,644 / 5,739 | 18,647 / 38,606 | 102,491 / 236,328 |
| Q6 · Pretraga, poredak po ts_rank | 0,835 / 1,468 | 0,951 / 2,62 | 2,684 / 21,721 | 12,558 / 215,22 |
| Q6 · Pretraga, poredak po popularnosti | 0,822 / 1,354 | 0,943 / 3,964 | 2,307 / 32,376 | 4,253 / 81,232 |
| Q6 · Broj rezultata pretrage, ograničen na „1000+” | 0,644 / 1,061 | 0,801 / 1,528 | 2,506 / 4,862 | 7,576 / 32,24 |
| Q7 · B2B cijene (24 artikla × grupa kupca) | 0,639 / 0,885 | 0,694 / 0,944 | 0,741 / 1,049 | 0,923 / 1,28 |
| Upit | 10.000 | 100.000 | 1.000.000 | 5.000.000 |
|---|---|---|---|---|
| Q8 · paket izmjena, p50 / p95 (ms) | 32,833 / 40,702 | 52,073 / 59,884 | 38,27 / 48,606 | 109,345 / 137,335 |
| Q8 · od toga UPDATE p50 / COMMIT p50 (ms) | 23,564 / 7,648 | 43,917 / 7,609 | 30,56 / 7,054 | 55,72 / 52,895 |
| Q8 · redaka u sekundi (pri p50) | 30.457 | 19.204 | 26.130 | 9.145 |
| Q9 · početni unos, artikala u sekundi | 68.493 | 75.815 | 71.190 | 63.741 |
| Ukupno učitavanje (s) | 0,744 | 2,94 | 21,195 | 130,73 |
| Baza s indeksima (MiB) | 6,8 | 57,8 | 558,4 | 2.771,6 |
03Objašnjenje
Zašto su neki upiti ravni, a neki rastu
Indeks pogađa točno ono što stranica traži. Stranica proizvoda traži jedan redak po jedinstvenom slugu, prva stranica kategorije čita 24 retka iz indeksa koji je već složen po kategoriji i popularnosti, a B2B cijena dolazi jednim dohvatom po paru (grupa kupca, artikl). Posao ne ovisi o tome koliko je ostalih artikala u bazi, pa je razlika između 10.000 i 5.000.000 artikala najviše 0,284 ms medijana. Veći dio izmjerenog vremena je sam povratni put do baze (SELECT 1: 0,466 ms).
OFFSET plaća svaki preskočeni redak. Da bi došao do ~2000. stranice, OFFSET mora pročitati i odbaciti desetke tisuća redaka. Keyset paginacija nastavlja od zadnjeg viđenog para (popularnost, id) izravno u indeksu. Na 5.000.000 artikala to je 40,294 ms naspram 0,691 ms, oko 58×. Da keyset vraća iste retke kao OFFSET, provjerili smo na ~200. stranici za svaku veličinu.
Facete broje, a brojanje raste s podacima. Brojači faceta moraju proći kroz sve artikle koji odgovaraju filtru. Na 1.000.000 artikala to je 18,647 ms, a na 5.000.000 102,491 ms medijan jer česta boja u GIN indeksu atributa pogađa stotine tisuća redaka. S ovom shemom to više nije dovoljno za interaktivni filtar.
Kako bismo to riješili u stvarnom projektu
Ovo su inženjerske opcije, ne izmjereni rezultati. Nijedna nije primijenjena u ovom mjerenju.
Najčešće facete u zasebne stupce
Boja, veličina ili materijal kao tipizirani stupci sa složenim indeksom umjesto pretrage po jsonb atributima.
Unaprijed izračunati brojači
Agregati po kategoriji i vrijednosti atributa, osvježeni pri izmjeni kataloga, pa filtar čita gotov broj.
Zaseban pretraživač
Za vrlo velike kataloge facete i pretragu preuzima namjenski indeks za pretraživanje, a baza ostaje izvor istine.
04Metodologija
Kako smo mjerili i što nismo
Cijeli postupak opisan je u METHODOLOGY.md. Ovo je sažetak onoga što treba znati prije citiranja bilo koje brojke.
- Računalo
- Intel Core i7-13700K, 16 fizičkih / 24 logičke jezgre
- Baza
- PostgreSQL 16 u Docker Desktopu (WSL2), zadane postavke uz shared_buffers 1 GB i work_mem 32 MB
- Klijent
- Jedna veza (node-postgres) na istom računalu, upiti jedan za drugim, preko 127.0.0.1
- Ponavljanja
- 20 zagrijavanja + 300 mjerenja po upitu; sinkronizacija 20 mjerenih paketa
- Parametri
- Izvučeni iz stvarno učitanih podataka generatorom sa sjemenom (40 kursora, 100 kombinacija filtra, do 400 pojmova)
- Podaci
- Sintetički i deterministički katalog; 5.000.000 artikala zauzima 2.771,6 MiB s indeksima
Što nije izmjereno
- Mreža do kupca, TLS, CDN, renderiranje, slike i JavaScript. Mjerena je samo baza, ne učitavanje stranice.
- Istovremeni korisnici. Ovo nije test opterećenja nego krivulja troška upita po veličini kataloga.
- Hladna predmemorija. Svi upiti mjereni su nakon zagrijavanja.
- Stvarni katalog. Oblik krivulje važniji je od pojedinačne brojke.
- Druge platforme. Nismo mjerili WooCommerce, Shopify, Magento ni bilo koji drugi sustav, pa ovo nije usporedba.
Podaci i planovi upita
- JSONresults.jsonSve veličine, svi upiti, percentili, okruženje i bilješke s mjerenja.
- CSVresults.csvJedan redak po veličini i upitu: p50, p95, p99, max, prosjek, iteracije.
- MDMETHODOLOGY.mdShema, indeksi, generator podataka, postavke baze, ograničenja.
- TXTplans/5000000-Q5.txtPrimjer EXPLAIN (ANALYZE, BUFFERS) plana. Svi planovi: plans/<veličina>-<upit>.txt.
Kod mjerenja (schema.sql, generate.sql, indexes.sql, run.mjs) nalazi se u mapi scripts/scale-lab našeg repozitorija. METHODOLOGY.md opisuje svaki korak i naredbe za ponavljanje; kod šaljemo na upit. Pravila objave i ispravaka opisana su u uredničkoj politici.
FIN STUDIO (2026). Scale Lab 2026: koliko brzo radi e-commerce baza s 10.000 do 5.000.000 artikala. Izmjereno 24. rujna 2026. CC BY 4.0. https://finstudio.hr/istrazivanje/skaliranje-kataloga-2026
05Za vaš webshop
Što to znači za vaš webshop
Veličinu kataloga određuje arhitektura sustava. Stranica proizvoda, kategorija i B2B cijene ostaju brze i na milijunima artikala ako su indeksi projektirani oko stvarnih upita. Filtri, facete i pretraga traže odluku ranije: koje atribute izdvojiti, što unaprijed izračunati i kada uvesti pretraživač.
Zato ne prodajemo pakete s limitom artikala. Gradimo po vašem poslovanju: od velikog kataloga s više izvora podataka do feedova dobavljača i cjenika po kupcu.
Pitanja o Scale Labu
Koliko artikala može imati custom webshop?
Unaprijed zadane granice nema: veličinu kataloga određuje arhitektura sustava. U Scale Labu smo izmjerili istu PostgreSQL shemu na 10.000, 100.000, 1.000.000 i 5.000.000 artikala. Stranica proizvoda, kategorija i B2B cijene ostale su ispod 1 ms medijana na svim veličinama, ali brojači faceta na 5.000.000 artikala trebaju drukčiji dizajn (102,491 ms medijan s testiranom shemom).
Znači li to da se stranica webshopa učitava za 1 milisekundu?
Ne. Mjereno je samo vrijeme upita do baze, s klijentom na istom računalu i zagrijanom predmemorijom. Stvarni posjetitelj vidi i mrežu, TLS, CDN, renderiranje, slike i JavaScript. Brojke pokazuju kako trošak upita raste s veličinom kataloga, a ne brzinu stranice.
Je li ovo usporedba s WooCommerceom, Shopifyjem ili Magentom?
Nije. Nismo mjerili nijednu drugu platformu i brojke se ne smiju čitati kao usporedba. Mjerena je jedna PostgreSQL shema s jasno opisanim indeksima, na jednom računalu.
Zašto OFFSET paginacija usporava na velikim katalozima?
OFFSET mora pročitati i odbaciti sve retke prije tražene stranice, pa trošak raste s dubinom stranice i veličinom kataloga. Keyset paginacija nastavlja od zadnjeg viđenog para (popularnost, id) po indeksu. Na 5.000.000 artikala i ~2000. stranici izmjerili smo 40,294 ms za OFFSET i 0,691 ms za keyset (medijani).
Koliko brzo se mogu sinkronizirati cijene i zalihe?
Paket od 1.000 izmjena cijene i zalihe u jednoj transakciji trajao je 38,27 ms medijan na 1.000.000 artikala. To mjeri samo bazu; stvarni uvoz iz ERP-a ili feeda dobavljača obično ograničavaju parsiranje i mreža. Q8 ne raste ravnomjerno s veličinom kataloga; objašnjenje je u metodologiji.
Smijem li koristiti podatke Scale Laba?
Da. Podaci su objavljeni pod licencom CC BY 4.0: slobodno ih koristite, prerađujte i citirajte uz navođenje izvora „FIN STUDIO, Scale Lab 2026”, s poveznicom na ovu stranicu.