Avatar billede alvion Nybegynder
13. januar 2002 - 14:15 Der er 14 kommentarer og
1 løsning

Optimering af MySQL ved læsning af store tabeller

Jeg har en tabel på ca. 65.000 records (ca. 14 MB). Der bliver udført nogle queries med LIKE på et tekstfelt, fra Apache/PHP og det får httpd-processen til at banke op på 99% CPU-tid.

Findes der en måde hvorpå jeg kan få MySQL til at indlæse og beholde tabellen i hukommelsen - er det KEY_BUFFER_SIZE der styrer det?

Jeg leder efter en parameter til mysqld, hvis det findes.

Det er en her-og-nu løsning. Jeg er igang med at lave nye queries og bedre indekser, men indtil da skal det gerne virke.
Avatar billede erikjacobsen Ekspert
13. januar 2002 - 14:24 #1
De siger jo selv at hvis man har 256 MB, så skal man sætte

key_buffer=64M
table_cache=256
sort_buffer=4M
record_buffer=1M

men om det løser dit problem er jo ikke til at vide. Det lyder godt at du er med
på at lave strukturen om :)
Avatar billede henrik_ffc Nybegynder
13. januar 2002 - 14:27 #2
Du kan måske kopiere det hele til ram således:
mysql_query(\"create temporary table if not exists tamtabel (felt1 int not null, felt2 text) type=heap\");
mysql_query(\"insert into ramtabel select felt1,felt2 from disktabel\");

Herefter kan du lave alle dine queries på tabellen i ram
Avatar billede erikjacobsen Ekspert
13. januar 2002 - 14:41 #3
Hvis du ikke opdaterer tabellen ret tit, men søger tit, vil jeg hellere anbefale dig
det hack, at trække søgefeltet ud i en rå tekstfil, men id-nummer til posten, og
have et lille Perl script til fritekst søgning. Det vil gå overraskende hurtigt:)
Avatar billede alvion Nybegynder
13. januar 2002 - 15:01 #4
Jeg har nu fundet ud af, at mine queries var der ikke noget galt med (bortset fra at der bruges \"like\"...)

Problemet ligger et andet sted i koden - noget med en uendelig løkke. Det underlige er så bare, at koden ikke er blevet ændret siden det kørte fint...

Jeg har installeret en ny Apache og Php i mellemtiden - det må ha\' gjort et eller andet. ;-)

Men jeg kan alligevel bruge dine tips om mysql variable Erik, så dem må du gerne få point for :-)
Avatar billede erikjacobsen Ekspert
13. januar 2002 - 15:05 #5
Jeg vil hellere have én til at slå græsplænen til sommer .... men lad gå

Er det koden bagved i PHP, C, eller .... der er noget i vejen med? De 65000 ligner
alt for meget 2^16, så hvis du har et 16 bits tal uden fortegn, der får overløb,
kan du få problemer. Jeg mener dog at alle tal i PHP, og Perl er 32 bits, så måske
er det alligevel ikke det??
Avatar billede alvion Nybegynder
13. januar 2002 - 15:12 #6
For at styre din nysgerrighed - det var denne kodestump:

for($i=$pos*$seg+1 && $start=0; $i*$num<=ceil((sizeof($result)/$num))*$num && $i<$seg*($pos+1)+1; $i++ && $start=$start+$num )
    if($base != $start) 
        if ($i == \'0\'){}
        else{       
            echo \"<a href=\\\"?base=\".($i*$num-$num).\"&pos=\".$pos.\"&searchquery=$searchquery&action=search\\\"><b>\".$i.\"</b></a> \";
        }
    else{
        if ($i == \'0\'){}
        else{
            echo \"<b><font color=red>$i</font></b> \";
        }
    }

Jeg vil godt lige gøre opmærksom på, at det ikke er mig, der har lavet koden. Jeg er blevet sat til at optimere den... ;-)

Og nej jeg kommer fandme ikke og slår din græsplæne! :-) Jeg har problemer nok med min egen.

Jeg tror ikke at det er overløb, idet \"min\" query kun returnerer 96 records. Dvs. sizeof($result) er 96.

Det ser mig noget skummelt ud - men jeg har som sagt også fæle planer om at skrive hele koden om.

Hvor er der da godt nok nogen mennesker, som skriver slamkode... ;-)
Avatar billede erikjacobsen Ekspert
13. januar 2002 - 15:20 #7
Det er bedre at bruge komma end && i første og tredie \"parameter\" til for-løkken.
Så er man sikker på at begge udføres, og at man ikke pludselig havner i at den
første er false, så den anden springes over. I anden \"parameter\" skal den være der,
for det er et logisk udtryk. Altså:

for($i=$pos*$seg+1,$start=0; $i*$num<=ceil((sizeof($result)/$num))*$num && $i<$seg*($pos+1)+1; $i++,$start=$start+$num )

men det kan da ikke være det ....
Avatar billede Slettet bruger
13. januar 2002 - 15:22 #8
Du har styr på dine nøgler og indexes ik?
Avatar billede erikjacobsen Ekspert
13. januar 2002 - 15:24 #9
Men hvis du har en uendelig løkke er det nok fordi $num er 0 - eller udefineret
Avatar billede alvion Nybegynder
13. januar 2002 - 15:26 #10
Ja jeg har styr på indekser - fejlen ligger som sagt heller ikke i databasen.

Du har ret i det med komma - det havde jeg ikke selv set. Ovenstående kode bruges til at generere en \"bladre liste\" (du ved til søgeresultater hvor der vises 20 af gangen).

Men jeg vil ikke pille mere ved koden, jeg har selv lavet en stump, der virker bedre... ;-)
Avatar billede alvion Nybegynder
13. januar 2002 - 15:37 #11
Erik -> Det er måske lidt OT, men kan du anbefale en god dansk lærebog i databaser?

Jeg skal muligvis undervise igen på Datanom uddannelsen i \"Databaser 1\", og den bog jeg tidligere har brugt er på engelsk og (ifølge mine kursister) lidt for avanceret.
Avatar billede erikjacobsen Ekspert
13. januar 2002 - 16:03 #12
Jeg kender ikke nogen på dansk. Den bedste er naturligvis Elmashri
Avatar billede alvion Nybegynder
13. januar 2002 - 17:09 #13
Kan du give mig titlen på den, evt. et ISBN nr?
Avatar billede alvion Nybegynder
13. januar 2002 - 17:21 #14
\"Fundamentals of Database Systems\"...

Hør hov! Det var da vist nok også den jeg selv havde på datamatiker studiet! :-) Det havde jeg rent glemt, men det var også en fotokopieret udgave og den er vist i mellemtiden forsvundet.

Herligt! Den tror jeg hellere, at jeg må få købt. Jeg kan se på Amazon, at den nu også indeholder objektorienteret datadesign.
Avatar billede erikjacobsen Ekspert
13. januar 2002 - 18:19 #15
Det lyder som den rigtige - og den er der flere der bruger på Databaser 1.
Den er ikke nem, men det skal den jo heller ikke være :)
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