25. juli 2006 - 01:37Der 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.
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....
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).
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....
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 ?
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)
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 ?
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));
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.
Tusind tak, jeg tror det er en god ide at jeg læser lidt op på dette emne :)
Synes godt om
Ny brugerNybegynder
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.