Avatar billede dennism Nybegynder
30. januar 2007 - 15:31 Der 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.
Avatar billede Slettet bruger
30. januar 2007 - 15:43 #1
har du indekseret de felter du søger/sorterer på?
Avatar billede dennism Nybegynder
30. januar 2007 - 16:30 #2
Ja, de er indekseret på kolonnen id - forsøgte jeg at sige ved at skrive at de havde et unikt id.
Avatar billede 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
Avatar billede 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 :)
Avatar billede dennism Nybegynder
30. januar 2007 - 17:09 #5
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)

echo "Navn: ".$row['name']."<br>";
echo "Første behandling: ".$row2['date'];
}



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?
Avatar billede 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...
Avatar billede dennism Nybegynder
31. januar 2007 - 09:19 #7
Kan du linke til et sted i manualen, hvor du synes jeg bør læse?
Avatar billede dennism Nybegynder
01. februar 2007 - 09:31 #8
Tak for hjælpen her - smider du lige et svar?
Avatar billede dennism Nybegynder
03. februar 2007 - 12:49 #9
Kan jeg få et svar her?
Avatar billede Slettet bruger
05. februar 2007 - 12:10 #10
Hej
Det var så lidt. Håber du fik løst problemet.
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