Scholieren.com forum

Scholieren.com forum (https://forum.scholieren.com/index.php)
-   Software & Hardware (https://forum.scholieren.com/forumdisplay.php?f=20)
-   -   [MySQL] Grootte van database berekenen... (https://forum.scholieren.com/showthread.php?t=1144486)

Triloxigen 02-04-2005 18:52

[MySQL] Grote van database berekenen...
 
Ik ben al een tijdje over aan het nadenken, maar kan geen echt effectieve manier bedenken voor het volgende probleem..

Ik heb een database met iets als zo:
Code:

id  | pid  | title      | text
----------------------------------
1  | 3    | test 2    | hallo, flip
1  | 4    | test 8    | hallo, flap
1  | 4    | test 4    | hallo, flop
1  | 3    | test 3    | hallo, flup

Nu wilde ik als eindresultaat weten hoeveel kilobyte alle regels zijn gegroupeerd per pid.

"TABLE STATUS" kan helaas alleen de formaten van tabellen terug geven, maar ik wilde van de regels afzonderlijk weten.

Dr HenDre 02-04-2005 19:41

iets in de zin van select * from blaat where pid=3
en alle tekens tellen, en dan weet je hoeveel bytes je hebt

Triloxigen 02-04-2005 20:40

Citaat:

Dr HenDre schreef op 02-04-2005 @ 20:41 :
iets in de zin van select * from blaat where pid=3
en alle tekens tellen, en dan weet je hoeveel bytes je hebt

Dat had ik ook al bedacht...
Maar is ver weg van prettige oplossing..
Het gaat namelijk om +/- 50 verschillende tabellen ;)

eddie 03-04-2005 11:44

datatypes opvragen en bij varchars gemiddelden nemen.

Triloxigen 03-04-2005 12:57

Citaat:

eddie schreef op 03-04-2005 @ 12:44 :
datatypes opvragen en bij varchars gemiddelden nemen.
De regels verschillen per grote :)

dafelix 03-04-2005 13:16

kent MySQL geen gemiddelde functie? (zoja: aantal rows*gemiddelde lengte=size) Dan is duurt het nog even voordat je query klaar is...

Triloxigen 03-04-2005 13:27

Zoals ik al zei, de regels verschillen van grote..
Er is dus geen gemiddelde te berekenen...

eddie 03-04-2005 14:03

de regels kunnen niet wisselen van grootte; je hebt per regel een maximale grootte (=max van alle datatypen).

int + int + varchar(30 ) = 34 bytes max per regel.

Triloxigen 03-04-2005 14:27

En wat als er velden als type 'text' zijn, en de ene regel 2 woorden bevat, en de volgende 200.

:)

Overigens is de berekening maar 1x per dag op een nachtelijk tijdstip.

eddie 03-04-2005 15:52

als het goed is, een een text max 4 bytes in de tabel. De database maakt een apart bestand waar de inhoud van de text wordt opgeslagen (met een 4-byte adres).

Triloxigen 03-04-2005 16:02

En jji denkt dat een HTTP account access heeft tot de MySQL bestanden? :p

Gimme more beer 03-04-2005 16:56

Citaat:

********** schreef op 03-04-2005 @ 15:27 :
Overigens is de berekening maar 1x per dag op een nachtelijk tijdstip.
Dan kun je altijd nog regel voor regel gaan uitlezen natuurlijk :)

Triloxigen 03-04-2005 17:51

Citaat:

Gimme more beer schreef op 03-04-2005 @ 17:56 :
Dan kun je altijd nog regel voor regel gaan uitlezen natuurlijk :)
Dat is de laatste optie waar ik naar zocht eigenlijk.. ;)

Gimme more beer 03-04-2005 18:58

Citaat:

********** schreef op 03-04-2005 @ 18:51 :
Dat is de laatste optie waar ik naar zocht eigenlijk.. ;)
Hehe, kan ik me voorstellen :)

eddie 03-04-2005 19:26

Klein beetje hulp:
http://dev.mysql.com/doc/mysql/en/st...uirements.html

Citaat:

VARCHAR and the BLOB and TEXT types are variable-length types. For each, the storage requirements depend on the actual length of column values (represented by L in the preceding table), rather than on the type's maximum possible size. For example, a VARCHAR(10) column can hold a string with a maximum length of 10. The actual storage required is the length of the string (L), plus 1 byte to record the length of the string. For the string 'abcd', L is 4 and the storage requirement is 5 bytes.
http://dev.mysql.com/doc/mysql/en/blob.html
Citaat:

Each BLOB or TEXT value is represented internally by a separately allocated object. This is in contrast to all other column types, for which storage is allocated once per column when the table is opened.
[edit]
http://dev.mysql.com/doc/mysql/en/st...-overview.html
Citaat:

TEXT

A TEXT column with a maximum length of 65,535 (2^16 − 1) characters.
[/edit]

Triloxigen 03-04-2005 20:38

Hoe de manier van opslaan is wist ik al.
Ik zoek alleen een efficiente manier om het uit te lezen ;)

(Of begrijp ik de hint niet?)

eddie 03-04-2005 21:54

Citaat:

********** schreef op 03-04-2005 @ 21:38 :
Hoe de manier van opslaan is wist ik al.
Ik zoek alleen een efficiente manier om het uit te lezen ;)

(Of begrijp ik de hint niet?)

:)

phpMyAdmin kan toch ook de grootte van de (inhoud van de) tabel uitlezen?

Triloxigen 03-04-2005 22:01

Citaat:

eddie schreef op 03-04-2005 @ 22:54 :
:)

phpMyAdmin kan toch ook de grootte van de (inhoud van de) tabel uitlezen?

Lees het topic nog eens :p

eddie 03-04-2005 22:15

Citaat:

********** schreef op 03-04-2005 @ 23:01 :
Lees het topic nog eens :p
:confused:
Je wilt het gegroepeerd per pid, toch? Als je weet hoe phpMyAdmin het doet, kun je het toch ook zelf maken :confused:

Enniewees, wat je ook kunt doen is alle kolommen omzetten naar tekst en daar de lengte van bepalen (=aantal bytes). Integers moet je dan omzetten naar hex-waarden.

Triloxigen 03-04-2005 22:17

Kolommen wijzigen is helaas geen optie.

Grouperen inderdaad per 'pid'.
Maar het formaat per 'pid' wil ik graag weten, niet de totale tabel formaat.

Enlightenment 04-04-2005 01:28

De grote database
De grootte van een database

;)

eddie 04-04-2005 07:51

Citaat:

********** schreef op 03-04-2005 @ 23:17 :
Kolommen wijzigen is helaas geen optie.

Grouperen inderdaad per 'pid'.
Maar het formaat per 'pid' wil ik graag weten, niet de totale tabel formaat.

uuh...

select sum( 4 + 4 + len( title ) + len( text ) )
from tabel
group by pid

Triloxigen 04-04-2005 12:10

Dat valt dus niet onder effectief.
Dan moet ik voor ieder tabel apart de tabel apart die query maken en uitlezen..
(50 tabellen * 25 cellen * 5000 regels+oplopend)

De reden van dit topic is juist om tot een echte oplossing te komen en niet iets als wat jij zegt, want dat had ik zelf ook al bedacht ;)

Allres regel voor regeld uitlezen is echt de aller laatste optie :)

eddie 04-04-2005 12:14

Citaat:

********** schreef op 04-04-2005 @ 13:10 :
Dat valt dus niet onder effectief.
Dan moet ik voor ieder tabel apart de tabel apart die query maken en uitlezen..
(50 tabellen * 25 cellen * 5000 regels+oplopend)

De reden van dit topic is juist om tot een echte oplossing te komen en niet iets als wat jij zegt, want dat had ik zelf ook al bedacht ;)

Allres regel voor regeld uitlezen is echt de aller laatste optie :)

php/mysql heeft vast wel:

- functies om alle tabellen op te vragen uit een database
- functies om alle kolommen (inclusief type en lengte) op te vragen van een tabel

Combineer de bovenste twee en bouw een dynamisch statement.

Triloxigen 04-04-2005 12:16

dat kan table status wel..
maar ik vind het allemaal toch niet echt effectief :p

Manuzhai 04-04-2005 14:21

Ja, hallo, je kan wel zoveel niet effectief vinden. Ik gok dat er geen andere oplossingen zijn dan degenen die er tot nu toe zijn aangedragen. Je probleem is dat je aan de hand van gegevens IN een tabel gegevens OVER die tabel probeert te bepalen; daar is SQL simpelweg niet op berekend. Het is een abstraction, en hoewel bij tijd en wijle leaky is het ook weer niet zo leaky. Je zult dus genoegen moeten nemen met de opties die tot nu toe zijn voorgesteld, of je moet gewoon (en dat is misschien verstandiger) de verschillende dingen met een ander gid in een andere table of zelfs in een andere database opslaan.

Triloxigen 04-04-2005 14:53

De beste optie (denk ik) is niet gegeven, heb op t.net ook even een topic geplaatst en daar kwam iemand met het geniale idee om gebruik te maken van INSERT INTO en dan dus een tijdelijke tabel te gebruiken met als voorwaarde de 'pid'.
Je hoeft dan alleen het formaat van de tijdelijke tabel uit te lezen, daarna leeg je die gewoon weer :)

Ik heb het nog niet in praktijk getest, maar dat ga ik later vandaag maar eens doen...

Indien iemand nog suggesties heeft hoor ik het graag.

En anders, bedankt voor het meedenken :)

Triloxigen 06-04-2005 22:13

Citaat:

eddie schreef op 04-04-2005 @ 08:51 :
uuh...

select sum( 4 + 4 + len( title ) + len( text ) )
from tabel
group by pid

Ik ga toch maar voor deze manier..

En voor de geintereseerde:
http://dev.mysql.com/doc/mysql/en/st...uirements.html

Triloxigen 07-04-2005 21:56

Van de ongeveer 870kb die de database bevat (volgens phpMyAdmin -> show) krijg ik maar 730kb geteld..
Iets gaat er nog niet goed :'(

Manuzhai 07-04-2005 21:57

Mogelijkerwijs mis je de indices? Check even hoe groot de .FRM, .MYD en .MYI files zijn. Het zou best kunnen dat je hiermee alleen de .MYD file hebt.

Triloxigen 07-04-2005 22:07

Citaat:

Manuzhai schreef op 07-04-2005 @ 22:57 :
Mogelijkerwijs mis je de indices? Check even hoe groot de .FRM, .MYD en .MYI files zijn. Het zou best kunnen dat je hiermee alleen de .MYD file hebt.
De bestanden al gechecked, die zijn 500Kb ;)

Maar ik ben net achter gekomen dat een aantal vars leeg zijn die gewoon gevuld moeten zijn...
Dus er zit nog een query fout :)

Edit: ik mis van iedere tabel een aantal b's :|
Edit2: het gaat overigens over MySQL3 (helaas niet 4).

Triloxigen 09-04-2005 12:08

Ik miste trouwens inderdaad de indices :)


Alle tijden zijn GMT +1. Het is nu 23:41.

Powered by vBulletin® Version 3.8.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.