Avatar billede mousedreamer Nybegynder
24. maj 2010 - 15:51 Der er 18 kommentarer og
1 løsning

database design for hastighed

jeg har oprettet to felter på en kundetabel som hedder extraInfoIDs og extraInfo hvor id'er og info er separaret af et specialtegn. Dette har jeg gjort istedet for at lægge dem i en separat tabel, fordi jeg mener jeg kan fordele arbejdsbyrden bedre mellem webserver og dbserver på den måde. Jeg kan så sortere dem i koden på webserveren med en split streng funktion og sætte dem i de rigtige felter i brugerfladen.

Nu har jeg så et medfølgende problem når jeg skal lave en søgning i extraInfo med et id som er i ekstraInfoIDs. Jeg er nødt til at splitte strengen i mysql samtidig med sægningen. Hvordan?

Skal jeg droppe min  metode og gøre det på den traditionelle måde ?
Avatar billede arne_v Ekspert
24. maj 2010 - 16:00 #1
Ja. Goer det den traditionelle maade.

Databaser er optimeret til at lave joins mellem tabeller.
Avatar billede arne_v Ekspert
24. maj 2010 - 16:02 #2
Hvis du er til daarlig performance og ulaeselig kode saa er tricket nok:

... WHERE CONCAT(',' , felt , ',') LIKE CONCAT('%,', detdulederefter, ',%')
Avatar billede mousedreamer Nybegynder
24. maj 2010 - 17:14 #3
Okay, jeg vil gætte på du har ret, men når nu der kommer 500.000 kunder og hver kunde har 5 ekstra felter, bliver søgningen ikke langsommere når der 2,5 millioner records istedet for 500.000 ? Synes egentlig det var mere overskueligt på min måde, fortæl mig hvorfor jeg tager fej, jeg forstår det ikke helt.
Avatar billede arne_v Ekspert
24. maj 2010 - 18:13 #4
Hvis du laver de rigtige index, saa den join hurtig.

Jeg vil snarere tro at test paa om en streng indeholder vil koere meget langsom fordi den kan ikke udnyttet index.
Avatar billede mousedreamer Nybegynder
24. maj 2010 - 18:23 #5
okay, det tænkte jeg nok. det er så nu jeg skal lære at bruge indexer. jeg har en slags fobi mod at læse om det fordi det lyder så ekstremt kedeligt, så hvis du giver mig sql sætningen til at lave indexet helt kort i denne situation er pointene dine.
Avatar billede arne_v Ekspert
24. maj 2010 - 18:30 #6
Det er nu ikke saa vanskeligt.

Lav dine SQL saetninger.

Find alle de felter som bliver brugt til = test og put index paa dem.

Det rammer du 80% rigtigt med.

De sidste 20% skal du saa laese dig lidt til.
Avatar billede mousedreamer Nybegynder
24. maj 2010 - 19:19 #7
select * from tExtraInfo where infoID=[infoID] and text like "%[text]%"

select * from tExtraInfo where kundeID=[kundeID]
Avatar billede arne_v Ekspert
24. maj 2010 - 19:27 #8
Der er der saa ingen join.

Men bare de to queries siger index paa:

tExtraInfo.infoID
tExtraInfo.kundeID
Avatar billede mousedreamer Nybegynder
24. maj 2010 - 20:02 #9
okay den her kan laves med en join, ikke ?

select k.*, ei.text from kunde k, tExtraInfo ei where k.id=ei.kundeID
Avatar billede arne_v Ekspert
24. maj 2010 - 20:08 #10
F.eks. ja.

kunde.id
tEkstraINfo.kundeID

skal have index for at denen fungerer godt.
Avatar billede public2 Nybegynder
25. maj 2010 - 20:20 #11
Nu går jeg ud fra at det er en MySQL database du har, og MySQL tilbyder desværre ikke så mange forskellige index muligheder, som f.eks. PostgreSQL, men der er stadig muligheder for at optimere databasen og motoren bag den.

Men kig også på din SQL queries, da de har en stor del af performancen med også, og søg evt. på brugen af Denormalization hvis du har mange og/eller store JOIN queries. Her kan du også hente en del performance, også selvom du bruger lidt længere tid på at duplikere data i flere tabeller er trade-off'et langt bedre i mange join tilfælde.

Og så skal du kigge på dine queries om det er range, point, multipoint, etc. og om der bliver brugt nogle af de mere tunge funktioner som Distinct og Group By, som også fortjener ekstra behandling. Og tænk over på hvad koden kan gøre for dig og hvad databasen skal gøre for dig og hvad de i fællesskab skal gøre.
Avatar billede mousedreamer Nybegynder
25. maj 2010 - 23:32 #12
Jeg forsøger at holde mig til helt simpel mysql da jeg muligvis skal  migrere til mssql senere. Det er derfor jeg helst vil joine og sortere i koden, plus jeg er bedst at til kode i forhold til db optimering. Indtil videre går det lynhurtigt med 20 brugere og 30000 kundeemner. public2, vil du også mene jeg skal droppe den metode jeg har beskrevet i første indlæg ? kommer søgningen med den metode til at være for langsom når der er 500.000 kundeemner ?
Avatar billede arne_v Ekspert
25. maj 2010 - 23:45 #13
Join er rimelig portabel mellem databaser. Portabilitet er ikke en god unskyldning for at undgå joins.
Avatar billede arne_v Ekspert
25. maj 2010 - 23:47 #14
Denormalisering bruges en gang imellem i den virkelige verden.

Men vent med at bruge det som optimerings metode indtil du har haft 5 års fuldtids arbejde med databaser.
Avatar billede public2 Nybegynder
26. maj 2010 - 08:26 #15
Jeg vil nu sige, at jeg ikke har arbejdet 5 års fuldtid med databaser, men jeg bruger og har brugt denormalisering ganske fornuftigt og alt efter opgaven, også ganske ofte til at optimere min performance.

Jeg arbejder med databaser i kraft af mit studie, men går ikke ud fra at det er hvad du tænker på. Men selvfølgelig er der altid plads til at blive bedre og gøre det bedre.
Avatar billede arne_v Ekspert
02. juni 2010 - 04:45 #16
Hvis man skal lave 1000 tabeller så vil der måske være:
- 800 tabeller uden performance problemer
- 190 tabeller hvor man skal optimere index for at få passende performance
- 9 tabeller hvor man skal bruge et materialized view for at få passende performance
- 1 tabel hvor man skal denormalisere for at få passende performance

Og det ene tilfælde vil altid være denormalisering på M siden og ikke som i dette tilfælde her på 1 siden.

På 1 siden giver det en liste af værdier i en kolonne og det vil ikke forbedre performance men derimod totalt dræbe performance.

Jeg prøvede at lave en lille test med 10000 korte række med 10 rækker i en anden tabel tilknytet versus 10000 lidt længere rækker og søge på de id'er som er PK versus konkataneteret. Java og MySQL.

Den normaliserede udgave var næsten 300 gange (ikke 300% men 300 gange) hurtigere.
Avatar billede arne_v Ekspert
13. juni 2010 - 03:58 #17
mousedreamer?
Avatar billede mousedreamer Nybegynder
17. juni 2010 - 09:57 #18
okay, så vidt jeg forstår, så er denormalisering det jeg har gang i. Det er simpelthen nemmere for mig at kode. Men jeg forstår godt for- og bagdelene nu. Læg et svar.
Avatar billede arne_v Ekspert
22. juni 2010 - 04:11 #19
Hvis det du har gang i er flere værdier kommasepareret i samme felt, så er der ingen fordele!

:-)

Og et svar fra mig.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester