[ dejankr @ 15.08.2011. 08:20 ] @
Na projektu na kojem trenutno radim imaću potrebu da čuvam više milijardi rekorda u tabeli pa se pitam da li je MySQL pravo rešenje za to. Nisam nikada radio sa tolikim tabelama pa nisam siguran šta mogu da očekujem od MySQL-a u tom slučaju. Imao sam prilike da radim sa tabelama sa stotinak miliona rekorda ali priroda podataka je bila takva da su se koristili uglavnom rekordi insertovani poslednjih nekoliko dana, a i mogle su lako da se particionišu što ovde nije slučaj.
Tabela sadrži par BIGINT polja i par datumskih polja (možda ću i njih da konvertujem u INT, pošto mi je bitno vreme samo do nivoa sata). Nad njom će uglavnom da se rade selectovi i updatovi po PK, ali imaću potrebu i da radim neke selectove po jedom od ovih datumskih polja. Neću raditi joinove sa ovom tabelom, sortiranje ili tako nešto...

Da li vredi pokušavati u ovom slučaju sa MySQL ili da se okrenem NoSQL varijantama? Možda mogu i da napravim dve tabele pa da zavisno od upita koristim jednu od njih jer bi u tom slučaju moglo da se lepo isparticioniše, ali me za početak zanima da li je toliki broj rekorda problem za mysql pošto nigde nisam uspeo da nađem da li postoji takvo ograničenje...
[ bogdan.kecman @ 15.08.2011. 08:36 ] @
1. nosql ti radi posao samo ako ti je tabela u formatu "key:value" inace mozes da pevas borbene sa istim
2. nosql trazi da imas "puno servera" da bi ishendlovao tu kolicinu podataka, ako imas dovoljno servera onda ti je najbolje resenje mysql cluster - ima sve kvalitetne osobine nosql servera + je relacioni (ako odlucis da ga tako koristis)
3. mysql moze da hendluje koliko oces slogova u tabeli, to nije problem, problem je sta ti hoces da radis sa tim slogovima? da radis update? da radis select? nad "celom" tabelom, nad "skupom" iz tabele?

dakle pitanje je koristenja ... jedan full table scan nad tom tabelom ce ti zabosti server na neko vreme ma kako jak bio taj server .. ako to hoces da radis - mysql nije za tebe ... ako imas upite koji vracaju realnu kolicinu podataka iz te tabele i upit se izvrsava nad indexiranim delom tabele onda nemas problem...

sad, ne ocekuj da ces tabelu od terabajt lepo da pretrazujes na kucnom serveru, ocekuje se brz io i dosta rama no u svakom slucaju tu dolazi do razlicitih "fora i fazona" koje mozes da iskoristis ... za pocetak
* budi siguran da koristis najnoviji mysql; ako tek krece razvoj projekta odma kreni sa 5.6, ako je projekat "ziv" onda 5.5
* za toliku tabelu je myisam brzi i uzima manje mesta na disku, ako imas konkurentne inserte i update onda je innodb nesto brzi, na zalost myisam nije crash safe niti je transakcion pa ti u tom slucaju opet bolje radi innodb. Ja bi to gurno u innodb ali ti treba da razmislis sta ti je bolje
* pre nego krenes da radis bilo sta, procitaj dobro sve sto mozes o mysql partitioningu, te isprojektuj tu tabelu tako da mozes da je particionises kako valja

[ dejankr @ 10.01.2012. 09:10 ] @
Mali update vezano za ovu temu pošto je ovih dana postalo aktuelno. Pomenutu tabelu sam napravio u MySQL. Još uvek popunjavam tabelu ali čini mi se da ne bi trebalo da imam problem. Pretraživanja po primarnom ključu radi brzo, kao i po drugoj indeksiranoj koloni. Trenutno imam oko 1.5 milijardi rekorda u njoj.

E sad, tokom populisanja tabele sam shvatio da bih jednu kolonu trebalo drugačije da definišem i popunim :(. Sad me zanima da li je bolje da dropnem samo tabelu ili celu bazu? Storage je Innodb i data fajl je trenutno oko 100 GB. Ako sam dobro shvatio, taj fajl se nikad ne smanjuje, ali MySQL ume da koristi prazan prostor u njemu. Ako dropnem celu tabelu pretpostavljam da taj prostor neće biti fragmetiran, ili se varam? Napominjem da tokom importa nije bilo drugih operacija nad bazom, dakle samo je radio ovaj proces za importovanje. Dakle, interesuje me ako obrišem tabelu i ponovo je importujem, da li će data fajl narasti za još 100 GB ili će iskoristiti prazan prostor u postojećem fajlu? Da li je u ovom slučaju bolje koristiti innodb-file-per-table=ON pošto pretpostavljam da u tom slučaju ne bih imao ovaj problem ako uradim drop tabele?
[ bogdan.kecman @ 10.01.2012. 12:04 ] @
ako uradis ALTER - narasce, ako dropnes tabelu i importujes je nece narasti
[ dejankr @ 10.01.2012. 14:15 ] @
Znači samo drop tabele? Ne moram ponovo da importujem celu bazu?
[ bogdan.kecman @ 11.01.2012. 07:49 ] @
kada dropnes tabelu, to postaje slobodan prostor, sledeca kreirana ide tu ...
ako uradis alter, pravi se nova tabela (stara se ne dira) pa se dropne stara na kraju, zato se poveca ibdata fajl

inace obzirom da ti je to neaktivan server, ja ti predlazem da dropnes SVE i reinportujes, trajace ali ces imati defragmentiranu datu .. zgodno ako spremas server za produkciju, bar da starta sa defragmentisanom datom....