Počítanie veľkosti dát v MySQL
Počítanie veľkosti dát v MySQL
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ť.
Re: Počítanie veľkosti dát v MySQL
Tu sa už jedná o pevné vypočítavanie (prípadne výber z Information Schema).
Príklad (MySQL 5.0):
Príklad na tvoj príklad:
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.
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).
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);
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.
Re: Počítanie veľkosti dát v MySQL
OK, vyskúšam dík
Re: Počítanie veľkosti dát v MySQL
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: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ť.
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.
Re: Počítanie veľkosti dát v MySQL
@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.
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
- Príspevky: 419
- Registrovaný: 30 nov 2006, 19:37
- Bydlisko: NO
- Kontaktovať používateľa:
Re: Počítanie veľkosti dát v MySQL
Zabudnem nato co ste tu fantazirovali a carovali hore.
velkost DB a celkovo kazdej tabulky mas takmer k dispozicii ziskas si ju nasledovne:
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
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"
-
audiotrack
VIP
- Príspevky: 25958
- Registrovaný: 09 sep 2005, 18:39
- Kontaktovať používateľa:
Re: Počítanie veľkosti dát v MySQL
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
- Príspevky: 89
- Registrovaný: 11 júl 2008, 16:53
- Kontaktovať používateľa:
Re: Počítanie veľkosti dát v MySQL
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
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
Re: Počítanie veľkosti dát v MySQL
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...
-> 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...
Re: Počítanie veľkosti dát v MySQL
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.
Re: Počítanie veľkosti dát v MySQL
@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...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.
@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.
Re: Počítanie veľkosti dát v MySQL
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".
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
- Príspevky: 89
- Registrovaný: 11 júl 2008, 16:53
- Kontaktovať používateľa:
Re: Počítanie veľkosti dát v MySQL
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ť
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ť
Re: Počítanie veľkosti dát v MySQL
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.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ť