Avatar billede trumf Nybegynder
25. juli 2006 - 01:37 Der er 12 kommentarer og
1 løsning

langsom join

Hejsa E

før jeg opdaterede til 5.0 var der ingen problemer, men nu er følgende blevet enormt langsomt. Kan nogen hjælpe ???

SELECT d.drueID, d.navn, d.navn2
FROM druer d 
LEFT JOIN druevin dv
ON dv.drueID = d.drueID
AND dv.vID = 'eb60a49c9978485f9167'
WHERE dv.drueid IS NULL
ORDER BY d.navn

Det den gør er, at den henter alle dem der i forvejen ikke er valgt.
Avatar billede fennec Nybegynder
25. juli 2006 - 08:16 #1
Jeg skal ikke kunne sige om den er hurtigere, men prøv med:

select drueID, navn, navn2 from druer where drueID NOT IN (select drueID from druevin where cID = 'eb60a49c9978485f9167') order by navn
Avatar billede trumf Nybegynder
25. juli 2006 - 09:12 #2
MySQL er ikke god til subselects. Den er langsommere!
Avatar billede trumf Nybegynder
25. juli 2006 - 09:24 #3
Den første tager ca 16 sek og select in tager "kun" ca 15 sek, men det burde da være muligt at konstruere noget SQL hvor det kun tager millisekunder....
Avatar billede fennec Nybegynder
25. juli 2006 - 09:33 #4
Det kommer an på hvor mange rækker du har. Jo flere rækker, jo længere tid. Men 15 sek lyder som lang tid. Hvilket sprog bruger du selecten i? Er det web (PHP/ASP) eller en application (C++/VB).

Har du indexes på de vigtige kolonner??
Avatar billede trumf Nybegynder
25. juli 2006 - 09:41 #5
Jeg er ved at rekonfigurere/normalisere og har ikke indexes på!
Det er web (C#.NET)
Avatar billede trumf Nybegynder
25. juli 2006 - 09:43 #6
Jeg er heller ikke helt så stærk i det med at indexere, eller jeg kan i hvert fald ikke se ideen med at indexere druevin tabellen, da det bare er en ekstra tabel til en mange til mange relation....
Avatar billede trumf Nybegynder
25. juli 2006 - 10:02 #7
Jeg har tre tabeller:
vin, med vin data
druer, med druer
og druevin, til at samle druer på en vin, den ser sådan ud:
CREATE TABLE druevin (
    dvID        int(11) AUTO_INCREMENT NOT NULL,
    vID          varchar(20) NOT NULL,
    drueID      int(11) NULL DEFAULT '0',
    druepct      smallint(6) NOT NULL DEFAULT '0',
    sortorder    tinyint(4) NOT NULL DEFAULT '0',
    PRIMARY KEY(dvID)
)
Hvad kan jeg gøre med det ?
Avatar billede fennec Nybegynder
25. juli 2006 - 10:23 #8
Jeg ville nok smide et index på drueID og evt også vID:
CREATE INDEX index_druevin_drueID ON druevin (drueID);
CREATE INDEX index_druevin_vID ON druevin (vID(5)); (kun de første 5 tegn indexseres)

http://dev.mysql.com/doc/refman/5.0/en/create-index.html

Hvor mange rækker har du ca i hver tabel på nuværende tidspunkt?
Avatar billede trumf Nybegynder
25. juli 2006 - 11:17 #9
137 i druer og knap 4000 i druevin
http://www.databasejournal.com/features/mysql/article.php/1382791
Jeg læste lige noget om "explain" og det giver jo et godt indtryk af hvad jeg skal gøre. Bjørnen blev barberet ned til 78 ms af de indexes.
Lægger du et svar ?

Takker
Avatar billede trumf Nybegynder
25. juli 2006 - 11:18 #10
ps. vID er ikke et tal, det er en guid, skal jeg så stadig kun indexere de første 5 tegn ?
Avatar billede trumf Nybegynder
25. juli 2006 - 11:26 #11
jeg havde allerede lavet det første index, bare på begge i samme index og det tog 78ms. Det slettede jeg så og lavede det du foreslog og det tog 108ms, men så lavede jeg begge i samme index igen, men kun med de 5 første og så kom den ned på 63ms....
CREATE INDEX index_druevin_drueID_vID ON druevin (drueID, vID(5));
Avatar billede fennec Nybegynder
25. juli 2006 - 11:40 #12
Problemet med index på tekstfelter er at jo mere tekst du indexsere, jo længere tid er den om at finde resultatet. Tilgængæld bliver den knap så præsis, hvis man kun indexsere noget af teksten. Det er altså en balancegang for hvor meget af teksten man vil indexsere.

Da du bruger guid er der ikke særlig stor sansynlighed for at de første tegn nogen sinde bliver ens, men det er noget du skal være opmærksom på, og i givet tilfælde evt forøge værdien.

.o) <-- One Eyed Jack
Avatar billede trumf Nybegynder
25. juli 2006 - 11:51 #13
Tusind tak, jeg tror det er en god ide at jeg læser lidt op på dette emne :)
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