Avatar billede hooh Nybegynder
19. juli 2003 - 10:06 Der er 17 kommentarer og
1 løsning

langsom udtræk

Jeg har konverteret min DB fra access til mySQL.

Når jeg kører nedenstående SQL så tager den omkring 30sek for at hente min data.

SELECT F.FORUM_ID, T.TOPIC_ID, T.T_SUBJECT, T.T_STATUS, T.T_LAST_POST, T.T_REPLIES FROM ((FORUM_FORUM F LEFT JOIN FORUM_TOPICS T ON F.FORUM_ID = T.FORUM_ID) LEFT JOIN FORUM_REPLY R ON T.TOPIC_ID = R.TOPIC_ID) WHERE (T_DATE > '20030619093422') AND (T.T_AUTHOR = 142 OR R.R_AUTHOR = 142) AND (T_STATUS < 2 OR R_STATUS < 2) AND F.F_TYPE = 0 ORDER BY T.T_LAST_POST DESC, T.TOPIC_ID DESC


Jeg har samme data i en access-db og når jeg udfører den der kører den betydelig hurtigere.

Kan nogen sige mig hvorfor og måske hvordan jeg kan fixe det?
Avatar billede arne_v Ekspert
19. juli 2003 - 10:24 #1
Har du oprettet INDEX på de relevante felter ?
Avatar billede arne_v Ekspert
19. juli 2003 - 10:25 #2
Du bør oprette INDEX på alle felter som:
  - ikke er primær nøgle
  - bruges i join betingelse eller where betingelse
Avatar billede hooh Nybegynder
19. juli 2003 - 15:37 #3
Jeg bruger "MySQL-Front" og helt ny i forbindelse med mySQL.

Hvor/hvordan sætter jeg index på felterne?
Avatar billede arne_v Ekspert
19. juli 2003 - 15:39 #4
CREATE INDEX indexnavn ON tabelnavn (feltnavn);
Avatar billede hooh Nybegynder
19. juli 2003 - 15:40 #5
Hvad skal indexnavn være? (er lidt dum til den slags)
Avatar billede hooh Nybegynder
19. juli 2003 - 15:43 #6
kan jeg sige

CREATE INDEX T_AUTHOR ON FORUM_TOPIC(T_AUTHOR)
Avatar billede arne_v Ekspert
19. juli 2003 - 15:47 #7
indexnavn er bare navnet på indexet.

Jeg ville nok bruge noget a la:

CREATE INDEX FORUM_AUTHOR_IX ON FORUM_TOPIC (T_AUTHOR)

[et navn som ikke overlapper med hverken tabel elle rfelt navne - og fortæller
havd det er]
Avatar billede hooh Nybegynder
19. juli 2003 - 15:49 #8
ok og det skal jeg lave på ALLE mine felter som ikke er primary.

Det er godt nok mange!

Kan man gøre det på en nem måde eller skal man skrive en create til alle?
Avatar billede hooh Nybegynder
19. juli 2003 - 15:50 #9
kan jeg ikke også få et svar fra dig, så du kan få nogle points :-)
Avatar billede arne_v Ekspert
19. juli 2003 - 15:51 #10
Nej.

Du skal lave det på felter som ikke er primary *OG* bruges
til JOIN og WHERE.
Avatar billede arne_v Ekspert
19. juli 2003 - 15:53 #11
Det må være:

FORUM_TOPICS FORUM_ID
FORUM_REPLY TOPIC_ID
T_DATE
T_AUTHOR
T_STATUS
F_TYPE

det er ikek så mange
Avatar billede arne_v Ekspert
19. juli 2003 - 15:54 #12
svar
Avatar billede arne_v Ekspert
19. juli 2003 - 15:54 #13
[men du skal vel lige se det virke først]
Avatar billede hooh Nybegynder
19. juli 2003 - 15:57 #14
er der en ulempe at lave index på alle felter.

Kan jeg ikke også få et svar istedet for en kommentar så du kan få nogle points
Avatar billede hooh Nybegynder
19. juli 2003 - 15:58 #15
Det virker nok bedre end det jeg har idag ;-)
Avatar billede arne_v Ekspert
19. juli 2003 - 16:01 #16
Index gør at den ikke behøver skanne hele tabellen for at finde
bestemte værdier.

Det er næppe alle indexene der vil blive brugt til den specifikke query, men
det er svært på forhånd at sige, hvordan MySQL vil udføre queryen, så ved at
sætte index på alle de relevante steder.

Det er ikke usædvaneligt at se en faktor 10-100 forbedring når man
får sat de rigtige index på.
Avatar billede arne_v Ekspert
19. juli 2003 - 16:02 #17
Der er et lille overhead ved INSERT når man laver indexes.

Så normalt vil man kun lave index på de felter hvor MySQL eventuelt skal
ud og finde bestemte værdier.
Avatar billede hooh Nybegynder
19. juli 2003 - 16:03 #18
tak for hjælpen.........
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