30. januar 2007 - 15:31Der er
9 kommentarer og 1 løsning
mySQL: langsom svartid
Jeg sidder med en tabel, hvor der er mere end 1.000.000 rækker. I denne forsøger jeg at lave denne mySQL-foresp. via PHP:
$sql = "SELECT date FROM statistic WHERE name='".$row['name']."' ORDER BY date ASC LIMIT 1";
Det lader dog til, at denne gennemsøger hele tabellen, og først derefter returnerer en række. Det er naturligvis ikke særlig holdbart, da det tager langtid - og jeg samtidig skal gennemføre denne proces for flere brugere.
Rækkerne har et unikt id og sorterer man dem med stigende id er der også stigende dato.
Er det ikke muligt at lave sådan, at den starter fra bunden og så snart den møder en hvor navnet passer, så giver den denne række? Så må dette også være den med laveste dato.
Ja, de er indekseret på kolonnen id - forsøgte jeg at sige ved at skrive at de havde et unikt id.
Synes godt om
Slettet bruger
30. januar 2007 - 16:36#3
ja, ved godt at din id er indekseret. Men hvor i dit udtræk er det lige at du trækker på id ? :-) Det afhænger selvfølgelig lidt af de udtræk du laver, men når vi taler tabeller på ~1 mio records, er det meget vigtigt at lave indeks på sine søgefelter, da søgetiden ellers kommer til at trække tænder. Jeg ville prøve at sætte indeks på date og/eller name
Synes godt om
Slettet bruger
30. januar 2007 - 16:41#4
Hvis du er i tvivl om hvilke felter du bør indekserer, kan du fint bruger EXPLAIN, til at give dig et hint :)
Jeg forstår ikke helt, hvad du mener med at indeksere?
Hvad jeg forsøger er noget i stil med dette:
$sql = "SELECT name FROM statistic WHERE customer='".$customer."'"; $result = mysql_query($sql);
while($row = mysql_fetch_array($result)) {
... ...
//for hver række i statistic med customer=$customer, vil jeg nu finde den ældste jf. dato-kolonnen $sql2 = "SELECT date FROM statistic WHERE name='".$row['name']."' ORDER BY date ASC LIMIT 1"; $result2 = mysql_query($sql2); $row2 = mysql_fetch_array($result2)
Dette tager naturligvis meget langtid, da tabellen indeholder ca. ½ mio records. Alle disse bliver søgt igennem for hver forekomst som tilhører $customer - dette er naturligvis ikke optimalt. Hvordan kan det laves hurtigere?
Synes godt om
Slettet bruger
30. januar 2007 - 18:31#6
kan ikke fortælle dig hvordan du kan optimere koden, da jeg ikke kender noget til din databasestruktur. Du bør læse MySQL-manualen vedr. brugen af indexes...
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.