Avatar billede rentondk Nybegynder
09. september 2003 - 13:19 Der er 32 kommentarer og
1 løsning

Overbelastet MySQL server

Jeg har en MySQL server, som er overbelastet.

Hvad kan man gøre for at nedsætte belastningen, uden at skulle invistere i en ny server?

Hvilke muligheder er der for caching? Er der nogle programmeringteknikker, som kan hjælpe? Andre gode ideer?

Databasen tilgåes via PHP.
Avatar billede arne_v Ekspert
09. september 2003 - 13:40 #1
Det kan vi ikke sige noget om på det foreliggende grundlag.

Er det MySQL eller PHP der bruger kraften ?

Er det CPU memory eller disk IO der er flaskehalsen ?

Hvad er typiske queries ?

(flere spørgsmål når disse er besvaret)
Avatar billede rentondk Nybegynder
09. september 2003 - 13:46 #2
>Er det MySQL eller PHP der bruger kraften ?

Der er kun db'en på den server, som er overbelastet.

>Er det CPU memory eller disk IO der er flaskehalsen ?

Der skulle efter sigende være næsten et konstant 100% CPU load.

>Hvad er typiske queries ?

Der er rigtig mange SELECT queries.
Avatar billede arne_v Ekspert
09. september 2003 - 13:52 #3
Komplekse joins mellem mange tabeller ?

Sortering (ORDER BY)) af mange records ?

Stor brug af MySQL funktioner (LOG POW og den slags) ?
Avatar billede dsj Nybegynder
09. september 2003 - 13:57 #4
Generelt set kunne man gøre noget i at optimere de forskellige queries og updates der er. Hvis der f.eks. er nogle hæftige joins, kunne man prøve at opdele dem i flere statements.

Dette er ikke en normal fremgangsmåde, men MySQL har tendens til at være rigtig hurtig til små ting, men modsat langsom til komplicerede ting. I så fald skal der overføres lidt arbejde til PHP'en. Om det i sidste ende kan betale sig, må man prøve sig frem til.
Avatar billede rentondk Nybegynder
09. september 2003 - 14:14 #5
>Komplekse joins mellem mange tabeller ?

Det maksimale join er mellem 2 tabeller. I hver tabel er der en primary key bestående af en attribut.

>Sortering (ORDER BY)) af mange records ?

Det er der. Der laves en sortering, for at vise en række poster sorteret efter tid.

>Stor brug af MySQL funktioner (LOG POW og den slags) ?

Nej.
Avatar billede rentondk Nybegynder
09. september 2003 - 14:15 #6
Til dsj:

>Generelt set kunne man gøre noget i at optimere de forskellige queries og updates der er. Hvis der f.eks. er nogle hæftige joins, kunne man prøve at opdele dem i flere statements.

Kan du give et eksempel?
Avatar billede arne_v Ekspert
09. september 2003 - 14:17 #7
Du kunne evt. prøve at undlade den ORDER BY og se om det hjælper
på CPU forbruget.

Ikke sandsyneligt, men det er måden. Man prøver forskellige ting
og ser om det hjælper.
Avatar billede rentondk Nybegynder
09. september 2003 - 14:18 #8
Der bliver lavet en del søgningen og dermed anvendt en del queries med LIKE.
Avatar billede websmith Nybegynder
09. september 2003 - 14:18 #9
Man kunne også sætte caching op.

join_buffer_size
key_buffer_size
query_cache_size

disse parametre in din my.cnf eller my.ini vil gøre dig i stand til at speede din server meget op forudsat at den har memory nok.
Avatar billede rentondk Nybegynder
09. september 2003 - 14:19 #10
>Du kunne evt. prøve at undlade den ORDER BY og se om det hjælper på CPU forbruget.

Jeg har desværre ikke adgang til serveren, men jeg vil prøve at få servermanden til at se, om der er en forskel.
Avatar billede simonvalter Praktikant
09. september 2003 - 14:21 #11
uden den store viden om mysql vil jeg forslå du kigger på "Index"  men det er ikke altid en fordel .. se på det her
http://www.mysql.com/doc/en/MySQL_indexes.html
Avatar billede websmith Nybegynder
09. september 2003 - 14:23 #12
Caching kan give meget stor performance fremgang, især hvis det ofte er de samme index som er i brug.

Det er jo trods alt billigere at købe en ½ Gib ram og dedikere den til caching end at købe en ny server.
Avatar billede rentondk Nybegynder
09. september 2003 - 14:26 #13
Avatar billede websmith Nybegynder
09. september 2003 - 14:27 #14
Optimize table er bare en restrukturering af data så index mv. bliver optimeret. Det er især godt at gøre hvis der er mange sletninger i tabellen, men hvis man kun tilføjer så er det lige gyldigt
Avatar billede websmith Nybegynder
09. september 2003 - 14:28 #15
mht caching så kig her på de forskellige godt parametre man kan stille på:

http://www.mysql.com/doc/en/Server_parameters.html
Avatar billede arne_v Ekspert
09. september 2003 - 14:28 #16
Fornuftig brug af index er kritisk for SQL performance. Men manglende
index vil normalt skabe en IO flaskehals ikke en CPU flaskehals.
Avatar billede rentondk Nybegynder
09. september 2003 - 14:28 #17
Angående index er der så ikke automatisk et index på primary keys?
Avatar billede arne_v Ekspert
09. september 2003 - 14:28 #18
Cache er også en god ting. Men igen ville jeg forvente IO problemer
ikke CPU problemer ved manglende cache.
Avatar billede arne_v Ekspert
09. september 2003 - 14:30 #19
Der er automatisk index på primary keys.
Avatar billede rentondk Nybegynder
09. september 2003 - 14:32 #20
Men måske der kunne mangle nogle index på andre relevante attributter.
Avatar billede arne_v Ekspert
09. september 2003 - 14:32 #21
renton>

Det bedste ville være hvis du kunne få en kopi af database og applikation
ned på en test maskine, hvor du kunne genskabe problemet og
eksperimentere frit.
Avatar billede arne_v Ekspert
09. september 2003 - 14:33 #22
Der bør altid være index på felter som man bruger til at joine på
og felter som man hyppigt bruger i normale where betingelser.
Avatar billede arne_v Ekspert
09. september 2003 - 14:34 #23
Den optimize table er en oprydnings/pakke funktion. Og altså nyttig
hvis der er opdateret og slettet heftigt i en tabel. Men ellers ikke.
Og igen er det IO ikke CPU.
Avatar billede rentondk Nybegynder
09. september 2003 - 14:35 #24
arne_v>

Men hvordan skaber man den samme belastning på test maskinen?
Avatar billede websmith Nybegynder
09. september 2003 - 14:36 #25
Det virker bare mærkeligt at en database server skulle være så presset bare med simple select statements.

Jeg ville ihvertfald prøve at slå lidt caching til for i det mindste at se om det skulle give lidt.
Avatar billede arne_v Ekspert
09. september 2003 - 14:38 #26
Man laver en simulator.

Enten:

simulator-PHP-MySQL

eller mere direkte:

simulator-MySQL
Avatar billede arne_v Ekspert
09. september 2003 - 14:39 #27
Simulatoren skal naturligvis være multithreaded og lave requests svarende
til "høj belastning".

Der er værktøjer tilgængeligt på internettet til den slags.
Avatar billede arne_v Ekspert
09. september 2003 - 14:39 #28
Og et svar.
Avatar billede arne_v Ekspert
09. september 2003 - 14:40 #29
Generelt vil man forvente at en database er IO bound og ikke CPU bound.
Avatar billede rentondk Nybegynder
09. september 2003 - 14:41 #30
websmith>

Nemlig ... der må gemme sig en mindre "fejl" et sted, som er skyld i det.
Avatar billede mfalck Praktikant
09. september 2003 - 14:48 #31
kører databasen på en linux-server eller en windows-maskine ? Kan du evt se om det faktisk er mysql som bruger al cpu-tiden eller det er en anden process ? Har du prøvet at vende database-serveren ?

du kan evt prøve at sætte lidt mere ram i maskinen; hvis hukommelsen er brugt op så kan det være at operativ systemet bruger kraft på at swappe ting ud på disken.

Og endeligt så kan det være en perfomance-forbedring at lægge database-pooling ind fra frontenden på maskinen.
Avatar billede mfalck Praktikant
09. september 2003 - 15:06 #32
http://sqlrelay.sourceforge.net/  er database-pooling for flere forskellige databaser (bla mysql) til forskellige programmeringssprog.
Avatar billede arne_v Ekspert
27. september 2003 - 13:46 #33
Tid at lukke spørgsmålet ?
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