mboost-dp1

mysql optimering!


Gå til bund
Gravatar #1 - buchi
10. jul. 2011 18:54
Ok, folk fra eksperten var sgu ikke til meget hjælp i denne ;)

Jeg står med en database med en relationstabel.

Nu er spørgsmålet bare hvordan den optimeres bedst muligt, eller om mit problem overhovedet har nogen relevans.

Der er to ID'er: grpID og usrID. De bindes sammen med nogle tilladelser: p1, p2, p4...

hvad giver bedst perfomance:

at lave en kolonne til hver tilladelse, eller at samle alle tilladelser i 1 kolonne (og så anvende bitshifting)

Det skal siges at jeg ikke kommer til at lave søgning på selve tilladelserne, så det er først efter at settet er trukket ud, de skal anvendes.
Gravatar #2 - KaW
10. jul. 2011 19:00
Konstruer dine queries, og smid dem igennem med MySQL med kommandoen EXPLAIN.

Fx. hvis du vil have forklaret hvordan "SELECT * FROM users" performer kan du køre kommandoen "EXPLAIN SELECT * FROM users". Du vil nu se hvordan MySQL bruger din data, hvilke joins den bruger, osv.

Gravatar #3 - buchi
10. jul. 2011 19:46
Og når mine to explains på test tabellerne er ens, må det antages at der ikke er nogen signifikant forskel på perfomance? :)
Gravatar #4 - arne_v
10. jul. 2011 20:13
#1

Hvis du kun laver select hvor du henter en enkelt brugers persmission, så er der næppe den store forskel på performance.

Den eneste løsning som duer udfra et software synspunkt er en ekstra tabel med en række per permission.
Gravatar #5 - buchi
10. jul. 2011 20:32
arne_v (4) skrev:
#1

Hvis du kun laver select hvor du henter en enkelt brugers persmission, så er der næppe den store forskel på performance.

Den eneste løsning som duer udfra et software synspunkt er en ekstra tabel med en række per permission.


I tilfældet med en ekstra tabel, kan jeg ligeså godt bruge bitshifting, og have en enkelt kolonne ekstra.

tilfældet er, at jeg kommer til at have nogle udtræk, hvor jeg skal bruge den tabel til at relatere to andre tabeller til hinanden. Jeg selecter ikke nogle af permission colonnerne i relationsudtrækket, og tænker derfor at MySQL selv fjerner den data, hvorfor det egentligt kan være ligegyldigt.
Gravatar #6 - arne_v
10. jul. 2011 21:18
#5

Der er et begrænset antal bits i felter af tal typer.
Gravatar #7 - buchi
10. jul. 2011 22:28
arne_v (6) skrev:
#5

Der er et begrænset antal bits i felter af tal typer.


INT er 4 bytes = 32 bits, (-1 for signed), men 31 pladser skulle stadig kunne gøre det :)

Jeg tror dog jeg laver en kolonne for hver tilladelse, også for at gøre debugginf lettere og gøre det mere overskueligt :)
Gravatar #8 - arne_v
10. jul. 2011 22:46
buchi (7) skrev:
INT er 4 bytes = 32 bits, (-1 for signed), men 31 pladser skulle stadig kunne gøre det :)


Design et system så det skal redesignes ved mere end 31-32 mulige permissions er ikke godt design.

buchi (7) skrev:
Jeg tror dog jeg laver en kolonne for hver tilladelse, også for at gøre debugginf lettere og gøre det mere overskueligt :)


Men et design hvor enhver ændring af permissions kræver ændringer i tabel struktur er naturligvis værre.
Gravatar #9 - buchi
11. jul. 2011 09:04
Der kommer højst sandsynligt ikke flere permissions (hvis der gør, er det fordi jeg ikke har tænkt mig ordentligt om nu ;) )



arne_v (8) skrev:
Men et design hvor enhver ændring af permissions kræver ændringer i tabel struktur er naturligvis værre.


hvad skal det sige? Det er en enkelt række der skal opdateres, hvis en tilladelse skal ændre:

| id1 | id2 | p1 | p2 | p3 | p4 | p5 | ...
Gravatar #10 - D_V
11. jul. 2011 09:58
buchi (9) skrev:

hvad skal det sige? Det er en enkelt række der skal opdateres, hvis en tilladelse skal ændre:

| id1 | id2 | p1 | p2 | p3 | p4 | p5 | ...



Det skal sige, at hvis du på et senere tidspunkt skal tilføje endnu en permission, så skal du ændre hele layoutet på tabellen. Hvilket fra et optimerings synspunkt samt designmæssigt synspunkt ikke er særlig smart.

Hvis du derimod bygger den op i stil med:
userid | permission

hvor du så indsætter et row per permission.

Så er det utrolig simpel at tilføje eller fjerne permissions senere hen, uden at skulle ænder tabel layoutet.

Og hvis du mener det er fordi du ikke har tænkt dig ordentlig om nu, hvis du senere skal bruge flere permissions. Så vil jeg opfodre til du ændre den holdning, det er umuligt at forberede et design til alle eventuelle fremtidige rettelser eller tilføjelser.
Gravatar #11 - buchi
11. jul. 2011 10:07
D_V (10) skrev:
Og hvis du mener det er fordi du ikke har tænkt dig ordentlig om nu, hvis du senere skal bruge flere permissions. Så vil jeg opfodre til du ændre den holdning, det er umuligt at forberede et design til alle eventuelle fremtidige rettelser eller tilføjelser.


Hvornår har linux sidst ændret på deres layout for fil rettigheder? ;) Men det kræver jo selvfølgelig en insigt projektet, for at vide om det er relevant at tale om flere permissions.

Problemet er bare at vi taler mange rækker ;) og hvis jeg skulle lave endnu en tabel med en rettighed pr. række, vil den fylde 10 gange mere end min relationsdatabase gør det.

Det vil desuden tilføje et unødvendigt lag af komplexitet.

Jeg ville faktisk bare vide hvad der var mest optimalt, at samle 10 rettigheder i et felt (i en int værdi) eller splitte dem ud på 10 felter.
Gravatar #12 - Daniel-Dane
11. jul. 2011 10:36
Spørger du, om query af én række med efterfølgende bitshifting er hurtigere end query af ti rækker?
Gravatar #13 - apkat
11. jul. 2011 11:43
buchi (11) skrev:
Hvornår har linux sidst ændret på deres layout for fil rettigheder? ;)

De havde jo tydeligvis også tænkt sig ordenligt om. Hvilket du er i tvivl om du har.
Gravatar #14 - buchi
11. jul. 2011 13:51
Daniel-Dane (12) skrev:
Spørger du, om query af én række med efterfølgende bitshifting er hurtigere end query af ti rækker?


Nej, uanset hvad, så antager vi at jeg trækker en række ud. I eksempel 1, er der 3 felter i den række, og i eksempel 2 er der 12. ved eksempel 1 har jeg samlet de 10 tilladelser i 1 int værdi. I eksempel 2 er de delt ud på 10 boolean værdier.

Hvad er hurtigst?



apkat (13) skrev:
De havde jo tydeligvis også tænkt sig ordenligt om. Hvilket du er i tvivl om du har.


Egentligt er jeg mest til at holde diskussionen i en ordentlig og saglig tone. Det er du åbenbart ikke glad for. Hvor mange iterationer tror du den tidlige UNIX model har været igennem før layoutet så ud som det gør?
Gravatar #15 - arne_v
11. jul. 2011 13:57
buchi (9) skrev:
Der kommer højst sandsynligt ikke flere permissions


Man designer ikke software efter den slags.

buchi (9) skrev:
(hvis der gør, er det fordi jeg ikke har tænkt mig ordentligt om nu ;) )


Det er ikke realistisk at kunne forudsige fremtiden.

buchi (9) skrev:
hvad skal det sige? Det er en enkelt række der skal opdateres, hvis en tilladelse skal ændre:


Ja, men der skal tilføjes en kolonne, hvis du skal tilføje en ny permission.
Gravatar #16 - arne_v
11. jul. 2011 13:59
buchi (11) skrev:
Hvornår har linux sidst ændret på deres layout for fil rettigheder?


Linux overtog et design fra Unix.

buchi (14) skrev:
Hvor mange iterationer tror du den tidlige UNIX model har været igennem før layoutet så ud som det gør?


Ikke nok.

Da de jo ca. 1990 da Unix begyndte at bliver meget udbredt kommercielt kunn konstatere at det oprindelige design ikke var godt nok.
Gravatar #17 - arne_v
11. jul. 2011 14:01
buchi (11) skrev:
Problemet er bare at vi taler mange rækker ;) og hvis jeg skulle lave endnu en tabel med en rettighed pr. række, vil den fylde 10 gange mere end min relationsdatabase gør det.


Vil du poste hvor mange procent antal brugere x antal permissions x 8 bytes (2 int) udgør af din harddisk?
Gravatar #18 - arne_v
11. jul. 2011 14:03
buchi (14) skrev:
Hvad er hurtigst?


Forkert spørgsmål.

Det første spørgsmål er: har den eventuellæe forskel nogen betydning for applikationens performance?
Gravatar #19 - arne_v
11. jul. 2011 14:03
buchi (11) skrev:
Jeg ville faktisk bare vide hvad der var mest optimalt, at samle 10 rettigheder i et felt (i en int værdi) eller splitte dem ud på 10 felter.


Og du har fået at vide at ingen af dem er optimale. Du skal have bruge rækker.
Gravatar #20 - apkat
11. jul. 2011 14:38
buchi (14) skrev:
Egentligt er jeg mest til at holde diskussionen i en ordentlig og saglig tone. Det er du åbenbart ikke glad for. Hvor mange iterationer tror du den tidlige UNIX model har været igennem før layoutet så ud som det gør?


wat?! Du skriver selv:


buchi (9) skrev:
Der kommer højst sandsynligt ikke flere permissions (hvis der gør, er det fordi jeg ikke har tænkt mig ordentligt om nu ;) )


Virker da dumt at lave noget der ikke kan ændres særligt let når du ikke selv er sikker på det er lavet ordenligt.

Indsæt selv "søde", "kære" osv. Jeg forstår ikke hvorfor du tager min kommentar så ilde op.
Gravatar #21 - buchi
11. jul. 2011 15:37
hmm...

scenarie 1:
det hele ryger i en tabel:
2 int for relation + 1 int for permissions. 12 byte pr relation (konstant)

scenarie 2:
2 int for relation + 1 for unikt id + 10 rækker af 2 int (en til relationsid og en til id for relationstabel). 12 byte + 80 byte = 92 byte (worst case)

hvis vi antager 100 000 rækker, vil det i 1 fylde 1 200 000 byte, eller 1,2 MB
i 2 vil det være 9,2 MB

Størrelsen af tabellerne er ikke problem, men hvad med søgetiden? Det betyder også en del? hvis der skal søges igennem 1 000 000 rækker (med index)
Gravatar #22 - D_V
11. jul. 2011 16:01
#21

Prøv det dog af, der er tydeligvis ingen her der kender svaret. Og at lave en simpel benchmark vil da være mega simpelt.

Derudover vil jeg mene du ikke bør tænke for meget over perfomance for mysql i nogen af scenarierne, men mere resten af din applikation. Da den nok nærmere vil blive flaskehalsen.
Gravatar #23 - arne_v
11. jul. 2011 16:14
#21

Det fylder ingenting på harddisk.

Det fylder ingenting i memory (cache).

Det er meget hurtigt at finde ting i memory (cache).

Det er svært at se hvorfor det skulle være et performance problem for din applikation.

Den rette google søgning er:
premature optimization
Gravatar #24 - arne_v
11. jul. 2011 18:01
#23

Husk at index har O(logn) karakteristika.

At gå fra 100K til 1M rækker øger kun index arbejdet med 20%.
Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login