Počítanie veľkosti dát v MySQL

Programovacie jazyky, rady, poradňa...
S-player
Light Star
Light Star
Príspevky: 277
Registrovaný: 23 júl 2011, 22:30

Počítanie veľkosti dát v MySQL

Príspevok od používateľa S-player »

Zdravím, vedel by mi niekto odporúčiť nejaký "systém" na počítanie veľkosti dát? Dáta sa ukladajú v MySQL databáze čo potrebujem je spočítať koľko dát ma dokopy daný user. Povedzme ,že mám tabuľku kde sú články. Vyberiem všetky články klienta a potrebujem ich sčítať čiže výsledok by mal vyzerať "823kB" (Jednotka nieje podstatná). Počítanie dát bude prebiehať pri každom jednom vložení, aktualizovaní alebo zmazaní. Aby to nebolo náročne tak najlepšou alternatívou je zrejme počítať každý jeden požiadavok a následne v detailoch klienta zvyšovať/znižovať hodnotu. Alebo je tu ešte druhá alternatíva a tou je zaznamenať riadok -> všetko spočítať tz. prejsť všetky tabuľky/riadky a túto hodnotu zaznačiť.
pcsiete
Medium Star
Medium Star
Príspevky: 413
Registrovaný: 07 dec 2012, 18:47

Re: Počítanie veľkosti dát v MySQL

Príspevok od používateľa pcsiete »

Tu sa už jedná o pevné vypočítavanie (prípadne výber z Information Schema).

Príklad (MySQL 5.0):

Kód: Vybrať všetko

CREATE TABLE tabulka (
        id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
        body REAL NOT NULL,
        meno CHAR(50) CHARACTER SET latin1,
        email VARCHAR(40) CHARACTER SET latin1,
        popis VARCHAR(300) CHARACTER SET utf8);
  • id je typu INT, veľkosť 4 bajty
  • body je typu REAL, veľkosť 8 bajtov
  • meno je CHAR(50), typ znakov je latin1 ktorý vyžaduje 1 bajt/znak. Teda 50*1 => 50 bajtov
  • email je VARCHAR(40), typ znakov je znova latin1, teda vyžaduje L*1 + 1 bajtov (kde L je dĺžka reťazca ktorá môže byť premenlivá (VARCHAR))
  • popis je VARCHAR(300), typ znakov je už utf8 (do 3 bajty/znak), teda L*3 + 2 bajtov (2 bajty sú potrebné na uloženie dĺžky reťazca, lebo 300 > 255).
Na internete si nájdi podrobne dokumentáciu k tvojmu databázovému nástroju, tam budú všetky veľkosti typov a metódy ukladania zapísané.

Príklad na tvoj príklad:

Kód: Vybrať všetko

CREATE TABLE clanky (
        id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
        uzivatel INT NOT NULL,
        nadpis VARCHAR(60) CHARACTER SET utf8,
        navstevy INT,
        clanok TEXT CHARACTER SET utf8);
Každý zápis bude mať minimálne id 4 bajty, uzivatel 4 bajty, nadpis 1 + L, navstevy 4 bajty, clanok 2 + L.
L sa ale mení (rovnako ako veľkosť utf8 znaku niekedy). Potom prirátaj konštantné veľkosti (4 + 4 + 1 + 4 + 2) a je to.
S-player
Light Star
Light Star
Príspevky: 277
Registrovaný: 23 júl 2011, 22:30

Re: Počítanie veľkosti dát v MySQL

Príspevok od používateľa S-player »

OK, vyskúšam dík
Everhard
Light Expert
Light Expert
Príspevky: 79
Registrovaný: 25 dec 2010, 14:41

Re: Počítanie veľkosti dát v MySQL

Príspevok od používateľa Everhard »

S-player napísal:Zdravím, vedel by mi niekto odporúčiť nejaký "systém" na počítanie veľkosti dát? Dáta sa ukladajú v MySQL databáze čo potrebujem je spočítať koľko dát ma dokopy daný user. Povedzme ,že mám tabuľku kde sú články. Vyberiem všetky články klienta a potrebujem ich sčítať čiže výsledok by mal vyzerať "823kB" (Jednotka nieje podstatná). Počítanie dát bude prebiehať pri každom jednom vložení, aktualizovaní alebo zmazaní. Aby to nebolo náročne tak najlepšou alternatívou je zrejme počítať každý jeden požiadavok a následne v detailoch klienta zvyšovať/znižovať hodnotu. Alebo je tu ešte druhá alternatíva a tou je zaznamenať riadok -> všetko spočítať tz. prejsť všetky tabuľky/riadky a túto hodnotu zaznačiť.
Ta prva moznost, ktoru si napisal je rozumnejsia. T.j. cachovat, resp mat priebeznu tabulku so sumou dlzok clankov - jedno cislo pre kazdeho pouzivatela a to pri cislo aktualizovat vlozeni/zmazani/uprave clanku:
pri vlozeni pripocitat dlzku znakov clanka.
pri zmazani odpocitat dlzku znakov clanka.
pri uprave odpocitat dlzku clanku a pripocitat novu dlzku clanku.
do tej dlzky asi zapocitavat aj nadpisy. ostatne policka ako pouzivatelske meno, heslo a podobne nie je potrebne spocitavat, kedze tie policka ma k dispozicii kazdy a su zanedbatelne.

cisla v priebeznej tabulke by mali byt spravne aj po case.
pre diagnostiku, ak si budes chciet overit spravnost cisiel v tabulke, nemas problem vytvori si pomocnu tabulku, zbehnut skript, ktory ti spocita pre kazdeho pouzivatela dlzku clankov a druhym skriptom si porovnas v oboch tabulkach, ci su cisla zhodne.
pcsiete
Medium Star
Medium Star
Príspevky: 413
Registrovaný: 07 dec 2012, 18:47

Re: Počítanie veľkosti dát v MySQL

Príspevok od používateľa pcsiete »

@Everhard: tento systém by bol pekný kebyže sa jedná len o dĺžku článkov osobitne. V prípade že by chcel raz v budúcnosti stránku vylepšovať, tento údaj by sa stal úplne nepotrebný. Príkladom sú napr. hlasovanie o článku a komentáre. Tých by bolo ako maku, a tie vedľajšie bajty na ktoré si predtým nedával pozor by sa nahromadili. Pri hlasovaní by sa jednalo minimálne o 9 bajtov na hlas (napr. niekde mám 350 hlasov na články (nehovoriac o komentároch), to je ~3.07KiB na jedného užívateľa. Menší portál s 1000 užívateľmi a máš ~3.07MiB a to už zaváži).
Komentáre si vyžadujú z hľadiska rýchlosti fixnú dĺžku a tak získaš už kopec bajtov vedľa. No a pre db je fuška naviac pripočítať alebo odpočítať nejaké číslo pri každom užívateľovi každú jednu jeho akciu.

Tieto veci treba robiť priamo v db pokiaľ to len ide.
TGiJack
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 419
Registrovaný: 30 nov 2006, 19:37
Bydlisko: NO
Kontaktovať používateľa:

Re: Počítanie veľkosti dát v MySQL

Príspevok od používateľa TGiJack »

Zabudnem nato co ste tu fantazirovali a carovali hore.

velkost DB a celkovo kazdej tabulky mas takmer k dispozicii ziskas si ju nasledovne:

Kód: Vybrať všetko

SELECT table_schema "Meno DB:", 
   Sum(data_length + index_length) / 1024 "Velkost v KB:" 
FROM   information_schema.`TABLES` as it
WHERE it.TABLE_SCHEMA = "moja_DB"
#AND
#it.TABLE_NAME = "tabulka_v_mojej_DB"
co sa mi nechce hladat v specifikaciach, ci je tato velkost je konecna alebo nie, lebo je velky rozdiel medzi, napriklad: innodb a myisam tabulkami .. nejdem tu pisat k tomu viac nic lebo by som len hadal, v kazdom pripade to hore ti vrati nejaku velkost toho co si zvolis, ta velkost je presne ta co pouzivaju rozne nastroje na spravu DB
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: Počítanie veľkosti dát v MySQL

Príspevok od používateľa audiotrack »

ty zabudni na to svoje fantazírovanie čo si napísal a ešte raz si prečítaj čo sa pýtal. Jeho nezaujíma veľkosť tabuľky, ale veľkosť dát pre jedného usera. Teda iba niektoré záznamy z nej + niektoré záznamy z iných tabuliek
miso250593
Medium Expert
Medium Expert
Používateľov profilový obrázok
Príspevky: 89
Registrovaný: 11 júl 2008, 16:53
Kontaktovať používateľa:

Re: Počítanie veľkosti dát v MySQL

Príspevok od používateľa miso250593 »

veď ono to nieje len tak, veľkosť dát je jedna vec, ale to koľko to zaberá na disku je vec druhá, indexy, fragmentácia myIsam...

ak chce počítať len veľkosť tých článkov, tak to sa dá podla dĺžky toho textu, ale pozor, znaky "c" a "č" zaberajú rozdielne veľa miesta
celkom pekne je to vidieť pri použití php funkcie strlen ktorá počíta počet bajtov, takže pri UTF-8 reťazcoch to vyzerá takto
abc = 3
abč = 4
ab姓 = 5

preto sa mi zdá ako lepšie riešenie sa pozrieť na veľkosť tabulky pred vložením a po vložení, a tento rozdiel považovať za veľkosť

ale pokiaľ chceš len veľkosť dát, tak mysql funkcia LENGTH() by mala vraciať počet bajtov, a CHAR_LENGTH() počet znakov
S-player
Light Star
Light Star
Príspevky: 277
Registrovaný: 23 júl 2011, 22:30

Re: Počítanie veľkosti dát v MySQL

Príspevok od používateľa S-player »

Nad tým som presne premýšľal či nebude jednoduchšie

-> Vziať veľkosť tabuľky
-> Vložiť dáta, vymazať, aktualizovať dáta
-> Vziať veľkosť tabuľky


Potreboval by som to čo najpresnejšie, najjednoduchšie...
pcsiete
Medium Star
Medium Star
Príspevky: 413
Registrovaný: 07 dec 2012, 18:47

Re: Počítanie veľkosti dát v MySQL

Príspevok od používateľa pcsiete »

1. a 3. operácia sú dobré ak plánuješ svoju štruktúru tabuliek meniť/upravovať, inak sú zbytočné kedže zakaždým vyberieš hodnotu na základe toho istého jedného vzorca.
Everhard
Light Expert
Light Expert
Príspevky: 79
Registrovaný: 25 dec 2010, 14:41

Re: Počítanie veľkosti dát v MySQL

Príspevok od používateľa Everhard »

pcsiete napísal:@Everhard: tento systém by bol pekný kebyže sa jedná len o dĺžku článkov osobitne. V prípade že by chcel raz v budúcnosti stránku vylepšovať, tento údaj by sa stal úplne nepotrebný. Príkladom sú napr. hlasovanie o článku a komentáre. Tých by bolo ako maku, a tie vedľajšie bajty na ktoré si predtým nedával pozor by sa nahromadili. Pri hlasovaní by sa jednalo minimálne o 9 bajtov na hlas (napr. niekde mám 350 hlasov na články (nehovoriac o komentároch), to je ~3.07KiB na jedného užívateľa. Menší portál s 1000 užívateľmi a máš ~3.07MiB a to už zaváži).
Komentáre si vyžadujú z hľadiska rýchlosti fixnú dĺžku a tak získaš už kopec bajtov vedľa. No a pre db je fuška naviac pripočítať alebo odpočítať nejaké číslo pri každom užívateľovi každú jednu jeho akciu.

Tieto veci treba robiť priamo v db pokiaľ to len ide.
@pcsiete: Pri komentari spocitas tiez dlzku komentara. Pri hlasovani to bude konstanta ktoru budes pripocitavat. Nic zlozite. Quernut primarny riadok v tabulke podla ID pouzivatela, updatnut stlpec kde je jedno cislo a tento stlpec nie je zaindexovane je tiez rychle. Index sa nemusi prerabat. Co sa ti zda pomale...

@S-player: Mimochodom neviem na co obmedzovat pouzivatela v pisani clankov. Vsak clanky maju minimalnu velkost. Par MB na pouzivatela. Pri dnesnych tisic GB diskoch... Nestaci ti obmedzit pocet clankov pre pouzivatela na 1000 a dlzku kazdeho clanku na 10000 znakov alebo kolko? Predsa len horsie je to s obrazkami a dokumentami.
pcsiete
Medium Star
Medium Star
Príspevky: 413
Registrovaný: 07 dec 2012, 18:47

Re: Počítanie veľkosti dát v MySQL

Príspevok od používateľa pcsiete »

Je hlúposť držať v db tú istú informáciu dvakrát keď sa tam už raz nachádza len v inej forme. Ku komentárom, ich dĺžka ti je nanič keď potrebuješ fixnú dĺžku.
Ako som už napísal, pri prestavbe štruktúry by sa stal taký index nepotrebnou a hlavne neplatnou informáciou. To je najrýchlejšia cesta k záplatovému "systému".
miso250593
Medium Expert
Medium Expert
Používateľov profilový obrázok
Príspevky: 89
Registrovaný: 11 júl 2008, 16:53
Kontaktovať používateľa:

Re: Počítanie veľkosti dát v MySQL

Príspevok od používateľa miso250593 »

no zase v tejto situácii radšej pripustim istú duplicitu dát (áno, je pravda že by sa nemalo ukladať niečo, čo sa da vypočítať) ale v tomto prípade je ten výpočet dosť zložitý (ak teda uvažujeme že chce počítať veľkosť dynamických dátových typov)

ale je pravda že údržba týchto záznamov nieje tak jednoduchá, pretože asi najideálnejšie riešenie by bolo použitie triggrov, no len tie v tomto prípade spomalia


ide hlavne o to, načo mu tieto informácie sú, lebo ak ich nepotrebuje získavať často, tak mu stačí ich v prípade potreby dopočítať, ak s nimi aj potrebuje nejako pracovať, tak ich duplicitne ukladať
S-player
Light Star
Light Star
Príspevky: 277
Registrovaný: 23 júl 2011, 22:30

Re: Počítanie veľkosti dát v MySQL

Príspevok od používateľa S-player »

miso250593 napísal:ide hlavne o to, načo mu tieto informácie sú, lebo ak ich nepotrebuje získavať často, tak mu stačí ich v prípade potreby dopočítať, ak s nimi aj potrebuje nejako pracovať, tak ich duplicitne ukladať
Potrebujem ich kontrolovať pri každej query užívateľa. Musím zistiť či má user ešte nejaké voľne miesto tz. či má povolanie pre vloženie nových dát.
Napísať odpoveď