22. marts 2001 - 09:59Der er
13 kommentarer og 1 løsning
Index eller ??
Hej sa,
Jeg sidder med en kundedatabase på XX antal tusinde kunder. Og der har jeg brug for at lave lidt over 400 count forespørgsler, for at få data til en side. Hvilket tager et sted mellem 7-9 min, og det er fuldstændigt uacceptabelt.
Så vil jeg gerne vide hvordan jeg løser dette på den bedst mulige måde ? - Har siddet og forsøgt at finde noget omkring at index\'ere det, men synes ikke rigtig at kunne finde noget om det, er det overhovedet muligt at index\'ere noget baseret på en \'count-sætning\' ??
Eller skal jeg oprette et cron job som kan ´index\'ere´ det i .txt filer ?
Jeg kunne selvfølgelig sagtens ligge det som et ´index´ i en .txt fil, men det vil resultere i mindre præcise tal. Og vil kræve at jeg ligger serveren ned i kortere perioder.
Du kan godt optimere en count, men det vil hjælpe en hel del hvis vi så et eksempel på en query.
Hvis du fx laver select count(*) where <feltnavn> = \'something\' er det en god ide at indexere <feltnavn>, men hvis kan se nogle eksempler på dine queries kan vi nok hjælpe mere.
brug count(*) istedet for select * + mysql_affected_rows .. hvis det er for langsomt, så lav et cronjob i perl. Du skal hente DBI/DBD driverne til mysql, og dernæst, så er det næsten som i php. her er et rimelig selbeskrivende eksempel på en simpel query i perl:
use DBI(); use strict; my $db=\'\'; my $host=\'localhost\'; my $user=\'\'; my $password=\'\';
sub mysql_query(**) {
my $dbh = $_[0]; my $query = $_[1]; $dbh->do($query);
} my $dbh = DBI->connect(\"DBI:mysql:database=$db;host=$host\", $user, $password, {RaiseError => 1});
mysql_query($dbh, \"INSERT INTO testingfromperl (navn, loglinie) values( \' et handle \' , \' en linie \')\");
Den laver en write-lock på tabellen, så tabellen bliver låst mens indexet bliver lavet. Alt efter antallet af poster kan det tage et par sekunder, men ellers sker der ikke noget.
Nu ved jeg jo ikke hvad du laver, men hvis alle dine queries er som ovenstående bare med forskellige værdier for kasseid og salgerid, så prøv følgende:
select count(*) as antal, kasseid, salgerid from segkunder group by kasseid, salgerid.
Ok... Prøvede du at kigge på de queries med \"group by\"? Hvis du kan bruge det output til noget, så er det VÆSENTLIGT hurtigere end at køre ~400 seperate queries.
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.