Avatar billede executer Nybegynder
22. marts 2001 - 09:59 Der 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.

Nogen som kan hjælpe mig ??

På forhånd tak.
Avatar billede defrost Nybegynder
22. marts 2001 - 10:04 #1
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.
Avatar billede brian@diku Nybegynder
22. marts 2001 - 10:04 #2
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 \')\");

$dbh->disconnect();

Avatar billede executer Nybegynder
22. marts 2001 - 10:10 #3
select count(kundeid) as count from segkunder where kasseid = $row[kasseid] and salgerid > \'0\'

Sådan ser alle querise næsten ud.
Avatar billede defrost Nybegynder
22. marts 2001 - 10:13 #4
Ovenstående kan optimeres ved at lægge et index på kasseid og salgerid (Et index på begge felter og ikke to på hver sin).

Altså:

alter table segkunder add index(kasseid, salgerid);
Avatar billede executer Nybegynder
22. marts 2001 - 10:17 #5
Okay det vil jeg prøve - der er ikke nogen problemer i at påføre et sådan index, sådan uden videre ?

Er lidt tilbageholdende da vi har 25 mand sidende og arbejder med data fra databasen lige nu.
Avatar billede chruker Nybegynder
22. marts 2001 - 10:18 #6
Så skal kasseid og salgerid i hvert fald være indekserede.
Avatar billede defrost Nybegynder
22. marts 2001 - 10:18 #7
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.
Avatar billede defrost Nybegynder
22. marts 2001 - 10:20 #8
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.

Måske du kan bruge det resultat til noget...
Avatar billede defrost Nybegynder
22. marts 2001 - 10:21 #9
Indexering gælder stadig i dette tilfælde.
Avatar billede defrost Nybegynder
22. marts 2001 - 10:24 #10
eventuelt kan du prøve at bytte rundt på felterne i querien, hvis det gør det mere brugbart for dig.

select count(*) as antal, salgerid, kasseid from segkunder group by salgerid, kasseid.

Så skal du muligvis også bytte rundt på din indexering:

alter table segkunder add index (salgerid, kasseid);
Avatar billede executer Nybegynder
22. marts 2001 - 10:26 #11
Okay det lyder som, det er lige det jeg har brug, men ligger det på i frokost pausen, og hvis det hjælper får defrost de 300 point.
Avatar billede defrost Nybegynder
22. marts 2001 - 10:38 #12
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.
Avatar billede executer Nybegynder
22. marts 2001 - 13:10 #13
Jeg har lavet index på kundeid - som er den primære nøgle i table.

det har gjort den ca. 30% hurtigere, men udslaget lå helt klart i at bruge en group by sætning istedet.

Takker!
Avatar billede defrost Nybegynder
22. marts 2001 - 13:44 #14
Det var skam så lidt.
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