Avatar billede nsmnsm Nybegynder
03. juni 2003 - 02:26 Der er 10 kommentarer og
2 løsninger

hastighed vedr. mange tabeller contra mange rows

FORORD - du har 100.000 brugere der hver kan have 100 breve.
Deraf har jeg opstillet 2 forskellige måder at gemme og hente data på.

eksempel1 :
_______________
      DB1
_______________
T1 BREVE        -- Brev_ID, user_ID, brev_txt, brev_dato
              1      1          Hej1      1-2-3
              2      3        Hej1      2-3-4
              3      2        Hej1      1-2-3
                      4      1        Hej2      2-3-5
______________
Med søgning - select * from T1 where user_ID = 1

ialt : 1 tabel, 100.000*100 rows = 10000000 rows. (der søges igennem ved max)


ELLER :

eksempel 2 :
_______________
      DB1
_______________
T1 USER_ID1    -- Brev_ID, Brev_text, brev_dato
                      1        Hej1      1-2-3
                      2        Hej2      2-3-5
                     
T2 USER_ID2    --  Brev_ID, Brev_text, brev_dato
                      3        Hej1      1-2-3
_______________
med søgning - select * from T1

ialt : 100.000 tabeller, hver 100 rows (max)




SPØRGSMÅL : I øverste eksempel vil man ved 100.000user*100breve få max 10000000 rows der skal søges igennem.
I nederste går du direkte ud i user (som er kendt) - og henter den info (max 100 rows) som vises.

Hvilken søgning er hurtigst - er det hurtigts at have alt i en DB med 1 tabel og mange rows eller
mange tabeller og få rows der søges igennem. Det skal dog siges, at eksempel 2 er lagt i sin egen selvstændige
database - og der skal derfor tages højde for der, at der også skal åbnes op for ny database ved dette kald.

Med venlig hilsen NSM
og på forhånd tak.
Avatar billede mahler Nybegynder
03. juni 2003 - 07:44 #1
Avatar billede mahler Nybegynder
03. juni 2003 - 07:46 #2
Hvis du laver inde indexes rigtigt, vil eksempel 1 sandsynligvis ikke være noget problem.
Avatar billede arne_v Ekspert
03. juni 2003 - 08:24 #3
Ingen tvivl.

1 tabel !

1)  Det er den rigtige relationelle måde at gøre det på.

2)  Det fylder langt mindre - der er overhead per tabel.

3)  Det er mindts lige så hurigt med index på user_ID (men husk det !).

4)  Det er nemmere at vedligeholde fordi der ikke skal oprettes
    en ny tabel hver gang der skal oprettes en ny bruger.
Avatar billede dsj Nybegynder
03. juni 2003 - 08:25 #4
Det vil altid koste mere tid, når man i et SQL-statement har joins, altså relationer mellem flere tabeller. At søge en enkelt tabel igennem vil altid være langt det hurtigste. Dermed ikke sagt at det er den rigtige løsning. I dit tilfælde er det mest korrekt med to tabeller, ellers får du et problem med at brugernes data er repræsenteret flere gange (er et problem ved opdatering).

Hvis man altid puttede alt i én tabel ville det jo bliver noget juks, som ikke er til at finde rundt i :)
Avatar billede arne_v Ekspert
03. juni 2003 - 08:29 #5
dsj>

Med al respekt tror jeg ikke at du har læst spørgsmålet grundigt nok.
Der er ingen joins i nogle at tilfældene. Det er 1 tabel og en
WHERE betingelse versus 100000 tabeller og ingen WHERE betingelse.
Og der vil ikke være redundate data bare et mareridt af ens
tabeller.
Avatar billede zapzap Nybegynder
03. juni 2003 - 10:37 #6
Arne_v har ret - Med den query du viser, vil du uden index få et full-table scan som du selv er inde på. Men med et index på user-id bliver svarmængden langt mindre. Så at hente 100 fra 100,000 er ikke noget problem, med mindre du begynder at lave underlige queries hvor databasen ikke har mulighed for at bruge indexer.
MEN: Du skal huske at opdatere 'statistics' på din database/tabel med de størrelser data, ved ikke om MySQL har noget automatisk til det.
Avatar billede dsj Nybegynder
03. juni 2003 - 10:48 #7
hmm sry - tænkte nok lidt mere end jeg læste > brugere der kan have et antal breve tilknyttet :-/
Avatar billede nsmnsm Nybegynder
03. juni 2003 - 11:52 #8
Arne v : yep er klar over, at eks. 1 er den traditionelle måde at opbygge en db på. Mht. indexering - så er jeg lidt i tvivl - for hvordan skal jeg lave index på eks. brev_id (i eks. har jeg godt nok sat dem som brev 1,2,3) men virkligheden ser anderledes ud - der er brev_ID autogenereret ud fra en dato. Mht. userid så vil user_id jo forefindes op til 100 gange i eks. 1. (da der er 100 breve fra hver user). Mht. vedligeholdelse yep kan godt se det måske er nemmere - dog kan man jo sige at ved eksempel 2 - har du en seperat DB som du kan smide et andet sted hen og kører eksempelvis i et større system fra en anden server.

dsj : Du har nu ikke helt uret alliegevel - for Ja der findes naturlivis en tabel med userinfo - og det ville betyde en Join hvis userinfo skal udtrækkes sammen med brevinfo. dvs så har jeg 2 DBaser, som der leges med på en gang. DOG er samme data jo så heller ikke repræsenteret det samme sted (så normalisering er iorden).

zapzap : som dig og arne er inde på mht. indexes - så måske jeg bare skal læse lidt mere om dette. Dog stadig mener jeg ikke indexering er helt på sin plads (jo mht. størrelse), da brev_id ikke er kendt kun userid som er repræsenteret 100 gange i samme tabel pr. user. og Nej det er jo ikke 100 ud af (100.000) breve men 100 ud af (100.000 * 100 breve), der vil ligge som rows contra 100.000 tabeller med hver 100 rows. Og som sagt er det jo user_id, som er den kendte parameter og ville derfor kunne lægges ud som en tabel i sig selv indeholdende users brevinfo. - her skulle alt så bare udtrækkes.


konklusion : eks.1 - 1db åbnes 100.000*100 rows gennemsøges (med/uden indexering - brev_id ukendt, user_id kendt men 100 af dem)

eks.2 - 2db åbnes 100.000 tabeller forefindes - tabel er kendt og data udtrækkes.

så jeg forstår det som : kun hvis indexering forefindes vil eks. 1 være hurtigst !

Tak for svar - og vil da naturlivis gerne lige have en opfølgning på denne kommentar :).
Avatar billede arne_v Ekspert
03. juni 2003 - 12:04 #9
Der findes 2 slags index unik og ikke-unik, da en user kan have
flere mails skal du naturligvis bruge et ikke-unik index.

Det burde være helt uproblematisk.
Avatar billede nsmnsm Nybegynder
03. juni 2003 - 13:09 #10
ok tak arne :) - jeg vil dybdelæse lidt om de indexes :)
er helt klar over, at hvis jeg KAN indexerer denne ene tabel med de mange rows - så er det at foretrække. var ikke helt klar over, om man kunne indexerer noget, som ikke var unikt.
Avatar billede arne_v Ekspert
03. juni 2003 - 13:39 #11
Det kan man.

Det er meget normalt.
Avatar billede nsmnsm Nybegynder
06. juni 2003 - 12:35 #12
arne v. Så har jeg læst lidt på de forskellige indexeringer.
Kan godt se, at indexering er klar at foretrække frem for oprettelse af nye tabeller for hver user. - også fordi en tabel jo fylder - og tør ikke tænke på hvis der var 100.000 tabeller i en db :) - bare tanken om windows, som skal åbne et dir med 100.000 filer heheheh, så kan jeg godt se hvilken tid det også kunne tage at åbne en DB med 100.000 tabeller.
Eneste minus er jo så bare (kan man sige) at netop en brev database skal der tit skrives ned i (og ikke kun bruges som søgning) - og mht. indexering så er det jo tidskrævende mht. skrivning, updates og sletning da index skal vedligeholdes. men alt ialt så er index løsningen på EN tabel med mange rows at foretrække frem for mange tabeller og få rows (også fordi denne sidste løsning er stik imod god db opbygning).
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