/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
hastighedsproblemer i MYSQL
Fra : Thomas Eriksen


Dato : 02-02-03 21:32

Hej



Jeg har en del problemer med at få min MySQL server (3.23.53-55) til at køre
ordenligt. Jeg har prøvet at installere 3 forskellige versioner af MySQL og
2 versioner af MyODBC (3,51.04 og 05) og lige lidt hjælper det på
hastigheden.



Jeg har lagt mærke til at det lader til at MySQL ikke lukker forespørgsler
der ikke er aktive eller er færdige med at overføre data, så der opbygges
mange åbne forespørgsler om som åbenbart tager ressourser fra alm drift af
MySQL.



http://62.89.2.29/fejl1.jpg

CPU forbruget går om du kan se på dette billede i tider op 100% bliver
deroppe og går derefter ned på ca 20%. Sådan går det derudaf og siden er
derfor meget langsom. Ligeledes kan man se på billedet at der er mange
forespørgsler i MySQL der bliver låst



Hvad Jeg håber der er en af jer der har en ide om hvad der kan være galt med
programmet jeg har aldrig oplevet det problem før efter jeg skiftede
serveren ud med denne.

--
Med venlig hilsen
Thomas Eriksen

http://www.hardwareonline.dk 24 Hour Hardware Portal.
http://www.atcomputing.dk Støjsvage kabinetter, kølere mv.



 
 
Peter Brodersen (03-02-2003)
Kommentar
Fra : Peter Brodersen


Dato : 03-02-03 00:20

On Sun, 2 Feb 2003 21:31:55 +0100, "Thomas Eriksen"
<thomas@hardwareonline.dk> wrote:

>CPU forbruget går om du kan se på dette billede i tider op 100% bliver
>deroppe og går derefter ned på ca 20%. Sådan går det derudaf og siden er
>derfor meget langsom. Ligeledes kan man se på billedet at der er mange
>forespørgsler i MySQL der bliver låst

Et gæt er at dine locks skyldes nogle ganske tunge queries. Du har et
par stykker, der har brugt et halvt minut, hvilket nok godt kunne
trække tænder ud.

--
- Peter Brodersen

Thomas Eriksen (04-02-2003)
Kommentar
Fra : Thomas Eriksen


Dato : 04-02-03 00:06

"Peter Brodersen" <usenet@ter.dk> skrev i en meddelelse
news:b1k927$8mb$1@dknews.tiscali.dk...

> Et gæt er at dine locks skyldes nogle ganske tunge queries. Du har et
> par stykker, der har brugt et halvt minut, hvilket nok godt kunne
> trække tænder ud.

Når serveren kører optimalt så tager de queries ikke mere end et par
sekunder, men det er lige somom at når først en query går over tiden så
tager den det hele med sig som en selvforstærkende effekt.

Jeg har dog opdaget nogle ting med serveren så jeg tager ud til vores
webhotel og prøver at opdatere BIOS og drivere mv, men jeg tror ikke det
løser problemerne helt.

--
Med venlig hilsen
Thomas Eriksen

http://www.hardwareonline.dk 24 Hour Hardware Portal.
http://www.atcomputing.dk Støjsvage kabinetter, kølere mv.



Jesper Frank Nemholt (04-02-2003)
Kommentar
Fra : Jesper Frank Nemholt


Dato : 04-02-03 04:05

"Thomas Eriksen" <thomas@hardwareonline.dk> wrote in message
news:3e3ef5c8$0$24702$ba624c82@nntp02.dk.telia.net...
> "Peter Brodersen" <usenet@ter.dk> skrev i en meddelelse
> news:b1k927$8mb$1@dknews.tiscali.dk...
>
> > Et gæt er at dine locks skyldes nogle ganske tunge queries. Du har et
> > par stykker, der har brugt et halvt minut, hvilket nok godt kunne
> > trække tænder ud.
>
> Når serveren kører optimalt så tager de queries ikke mere end et par
> sekunder, men det er lige somom at når først en query går over tiden så
> tager den det hele med sig som en selvforstærkende effekt.

Det er typisk det der sker ved ISAM tables. ISAM låser hele tabellen hver
gang, hvilket hurtigt bliver en flaskehals hvis du har mange samtidige
queries i samme tabel. Det gør at mange af dine SQLs bliver hængende som
"Locked".
InnoDB tables håndterer dette en hel del bedre.
Derudover så sløver log også en del, så hvis du kører med log og ikke reelt
behøver det så prøv uden eller prøv at optimér log parametre.
Og som sagt, prøv også at køre explain på dine selects for at se om du får
det rette ud af dine indexes, d.v.s. om optimizeren vælger korrekt og/eller
om dine indexes reelt er de bedste til de queries du laver.
Database-designet har også en del at sige. Hvis du propper for meget ind i
samme tabel kan den hurtigt blive hot-spot.

/Jesper



Jesper Frank Nemholt (03-02-2003)
Kommentar
Fra : Jesper Frank Nemholt


Dato : 03-02-03 23:57

"Thomas Eriksen" <thomas@hardwareonline.dk> wrote in message
news:3e3d7fb2$0$24717$ba624c82@nntp02.dk.telia.net...
> Hej
>
>
>
> Jeg har en del problemer med at få min MySQL server (3.23.53-55) til at
køre
> ordenligt. Jeg har prøvet at installere 3 forskellige versioner af MySQL
og
> 2 versioner af MyODBC (3,51.04 og 05) og lige lidt hjælper det på
> hastigheden.
>
>
>
> Jeg har lagt mærke til at det lader til at MySQL ikke lukker forespørgsler
> der ikke er aktive eller er færdige med at overføre data, så der opbygges
> mange åbne forespørgsler om som åbenbart tager ressourser fra alm drift af
> MySQL.

Med "forespørgsler" mener du reelle selects eller blot åbne connections ?
Det er nok persistant connections. De gør ingen skade. En klient kan
genbruge en persistant connection og derved spare tid i connect fasen.

> http://62.89.2.29/fejl1.jpg
>
> CPU forbruget går om du kan se på dette billede i tider op 100% bliver
> deroppe og går derefter ned på ca 20%. Sådan går det derudaf og siden er
> derfor meget langsom. Ligeledes kan man se på billedet at der er mange
> forespørgsler i MySQL der bliver låst

Hvilken tabeltype kører du med, ISAM eller InnoDB ?
ISAM tabeller er ikke velegnede hvis du har mange inserts, og generelt er
min erfaring at InnoDB tabeller er bedre til stort set alt.

Har du prøvet at køre explain på dine queries for at se om de bruger dine
indexes korrekt ?
Har du prøvet at køre dine queries direkte i MySQL (udenom ODBC) for at se
om der er forskel på performance.
Jeg tror ikke det er ODBC der driller.

> Hvad Jeg håber der er en af jer der har en ide om hvad der kan være galt
med
> programmet jeg har aldrig oplevet det problem før efter jeg skiftede
> serveren ud med denne.

Har du ændret i konfigurationen af MySQL i forhold til den gamle server ?

Hvordan er den sat op med buffers, logs etc. ?

/Jesper



Thomas Eriksen (05-02-2003)
Kommentar
Fra : Thomas Eriksen


Dato : 05-02-03 00:03

"Jesper Frank Nemholt" <jfn@dassic.com> skrev i en meddelelse
news:b1ms44$sh8$1@sunsite.dk...

> Med "forespørgsler" mener du reelle selects eller blot åbne connections ?
> Det er nok persistant connections. De gør ingen skade. En klient kan
> genbruge en persistant connection og derved spare tid i connect fasen.

Jeg mener selve selects. Jeg kan se at den kommer med selects heletiden
(hvad den også bør gøre med 200 brugere online)

> Hvilken tabeltype kører du med, ISAM eller InnoDB ?
> ISAM tabeller er ikke velegnede hvis du har mange inserts, og generelt er
> min erfaring at InnoDB tabeller er bedre til stort set alt.

Jeg kører med ISAM, hvorfor ja det må du spørge min programør om Jeg
står bare for selve serveren. Men jeg har besluttet mig for at jeg må finde
nogle manualer og guides så jeg kan sætte mig mere ind i tingene og få
optimeret installationen.

> Har du prøvet at køre explain på dine queries for at se om de bruger dine
> indexes korrekt ?

Nej Igen jeg er amatør på MySQL tidligere har det bare virket uden jeg
skulle pille så jeg har ikke brugt meget tid på at sætte mig ind i det. Jeg
har dog lige prøvet at slette nogle alle indexes på en af de store tunge
tabeller og det gav ikke noget fald i hastigheden så noget siger mig at de
ikke har været optimale.

> Har du prøvet at køre dine queries direkte i MySQL (udenom ODBC) for at se
> om der er forskel på performance.
> Jeg tror ikke det er ODBC der driller.

Jeg tror heller ikke at det er ODBC, men jeg kan da prøve at køre
forespørgslen direkte i MySQL bare for at se.

> Har du ændret i konfigurationen af MySQL i forhold til den gamle server ?

Den skule være ens med den gamle server

> Hvordan er den sat op med buffers, logs etc. ?

standard opsætning direkte fra instalationen.

Men du har givet mig nogle ting jeg kan kigge på. Jeg diskuterer tingene med
mine programører.

--
Med venlig hilsen
Thomas Eriksen

http://www.hardwareonline.dk 24 Hour Hardware Portal.
http://www.atcomputing.dk Støjsvage kabinetter, kølere mv.



Jesper Frank Nemholt (05-02-2003)
Kommentar
Fra : Jesper Frank Nemholt


Dato : 05-02-03 09:29

"Thomas Eriksen" <thomas@hardwareonline.dk> wrote in message
news:3e40465a$0$24686$ba624c82@nntp02.dk.telia.net...
> "Jesper Frank Nemholt" <jfn@dassic.com> skrev i en meddelelse
> news:b1ms44$sh8$1@sunsite.dk...
>
> > Med "forespørgsler" mener du reelle selects eller blot åbne connections
?
> > Det er nok persistant connections. De gør ingen skade. En klient kan
> > genbruge en persistant connection og derved spare tid i connect fasen.
>
> Jeg mener selve selects. Jeg kan se at den kommer med selects heletiden
> (hvad den også bør gøre med 200 brugere online)

OK.

> > Hvilken tabeltype kører du med, ISAM eller InnoDB ?
> > ISAM tabeller er ikke velegnede hvis du har mange inserts, og generelt
er
> > min erfaring at InnoDB tabeller er bedre til stort set alt.
>
> Jeg kører med ISAM, hvorfor ja det må du spørge min programør om Jeg
> står bare for selve serveren. Men jeg har besluttet mig for at jeg må
finde
> nogle manualer og guides så jeg kan sætte mig mere ind i tingene og få
> optimeret installationen.

OK. ISAM er ikke nødvendigvis dårligt i dit tilfælde. ISAM kan godt give god
performance, man har nogle designmæssige uheldigheder der gør at man hurtigt
render ind i problemer, specielt hvis man har mange inserts i få tabeller.

> > Har du prøvet at køre explain på dine queries for at se om de bruger
dine
> > indexes korrekt ?
>
> Nej Igen jeg er amatør på MySQL tidligere har det bare virket uden jeg
> skulle pille så jeg har ikke brugt meget tid på at sætte mig ind i det.
Jeg
> har dog lige prøvet at slette nogle alle indexes på en af de store tunge
> tabeller og det gav ikke noget fald i hastigheden så noget siger mig at de
> ikke har været optimale.

Afgjort.
Du kan se hvordan dine indexes virker ved at skrive explain foran en query.
Eksempel :

mysql> explain SELECT timecode, usertime, systemtime, waittime, runqueue60
FROM cpu WHERE (systemid = '3') AND timecode BETWEEN '2003-02-04 09:06:05'
AND '2003-02-05 09:06:05' ORDER BY timecode;
+-------+-------+---------------+----------+---------+------+------+--------
----+
| table | type | possible_keys | key | key_len | ref | rows | Extra
|
+-------+-------+---------------+----------+---------+------+------+--------
----+
| cpu | range | combined | combined | 10 | NULL | 754 | where
used |
+-------+-------+---------------+----------+---------+------+------+--------
----+
1 row in set (0.01 sec)

Hvis indexet fungerer så vil MySQL skrive navnet på indexet i key feltet.
Hvis der står NULL eller noget i den stil, så er det fordi MySQL har
vurderet at det ikke var værd at bruge dit index.
Dernæst skal du kigge på hhv. rows og Extra.
Det gælder om at have et database-design og index setup der minimerer rows
mest muligt i en select. Mange result rows koster tid.
I MySQL manualen på www.mysql.com, i kapitlet der beskriver explain
kommandoen, skriver de lidt om hvad de forskellige felter betyder og hvad
der er godt/skidt for performance.

Her er mit index fra tabellen i eksemplet :

mysql> show index from cpu;
+-------+------------+----------+--------------+-------------+-----------+--
-----------+----------+--------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation |
Cardinality | Sub_part | Packed | Comment |
+-------+------------+----------+--------------+-------------+-----------+--
-----------+----------+--------+---------+
| cpu | 1 | combined | 1 | systemid | A |
4 | NULL | NULL | |
| cpu | 1 | combined | 2 | timecode | A |
90507 | NULL | NULL | |
+-------+------------+----------+--------------+-------------+-----------+--
-----------+----------+--------+---------+
2 rows in set (0.18 sec)

Det er et kombineret index. 2 afgørende faktorer er dels at dette index
matcher de ting man søger på i sine queries. Jeg søger f.eks. altid med
angivelse af systemid og timecode. Derfor indgår disse 2 i mit index.
Dernæst er kardinalitets-faktor vigtig. I min database har jeg få systemids
men mange timecodes. Givet mine selects er der derfor stor forskel på om mit
index er systemid+timecode istedet for timecode+systemid. Det kan man se
direkte i en explain, da denne ender op med langt flere rows med
timecode+systemid end systemid+timecode. Det aktuelle index kan f.eks. på
mit arbejde levere en måneds data i løbet af et par sekunder, mens det
omvendte index, timecode+systemid, tager over 4 minutter og bruger en masse
CPU.

> > Har du prøvet at køre dine queries direkte i MySQL (udenom ODBC) for at
se
> > om der er forskel på performance.
> > Jeg tror ikke det er ODBC der driller.
>
> Jeg tror heller ikke at det er ODBC, men jeg kan da prøve at køre
> forespørgslen direkte i MySQL bare for at se.
>
> > Har du ændret i konfigurationen af MySQL i forhold til den gamle server
?
>
> Den skule være ens med den gamle server

OK.

> > Hvordan er den sat op med buffers, logs etc. ?
>
> standard opsætning direkte fra instalationen.

Det er muligvis i underkanten. MySQL i den normale udgave (på unix
ihvertfald) er meget spartansk konfigureret per default, saa den kan klare
sig med meget lidt RAM. Det koster naturligvis i performance hvis databasen
er stor.
Der er eksempler på alternative konfigurations-filer. De ligger i MySQL's
$HOME directory under :

share/mysql/my-small.cnf
share/mysql/my-medium.cnf
share/mysql/my-large.cnf
share/mysql/my-huge.cnf

Default for MySQL er vist my-small.cnf
Jeg bruger som regel my-large.cnf hjemme og my-huge.cnf på mit arbejde.

Du kan se konfigurationen af MySQL online, noget af den ihertfald, ved at
skrive show variables.

/Jesper



Thomas Eriksen (06-02-2003)
Kommentar
Fra : Thomas Eriksen


Dato : 06-02-03 01:03

"Jesper Frank Nemholt" <jfn@dassic.com> skrev i en meddelelse
news:b1qi09$pi2$1@sunsite.dk...

> OK. ISAM er ikke nødvendigvis dårligt i dit tilfælde. ISAM kan godt give
god
> performance, man har nogle designmæssige uheldigheder der gør at man
hurtigt
> render ind i problemer, specielt hvis man har mange inserts i få tabeller.

ok. Snakkede godt med en af mine klogere kammerater hvad det angår og han
nævnte også at ISAM lod til at give den bedste hastighed.

> Afgjort.
> Du kan se hvordan dine indexes virker ved at skrive explain foran en
query.
> Eksempel :

<KLIP Eksempel>

Tak for eksemplet det vil jeg lege med her i weekenden.

> Det gælder om at have et database-design og index setup der minimerer rows
> mest muligt i en select. Mange result rows koster tid.
> I MySQL manualen på www.mysql.com, i kapitlet der beskriver explain
> kommandoen, skriver de lidt om hvad de forskellige felter betyder og hvad
> der er godt/skidt for performance.

Det vil jeg læse på.

> Det er et kombineret index. 2 afgørende faktorer er dels at dette index
> matcher de ting man søger på i sine queries. Jeg søger f.eks. altid med
> angivelse af systemid og timecode. Derfor indgår disse 2 i mit index.
> Dernæst er kardinalitets-faktor vigtig. I min database har jeg få
systemids
> men mange timecodes. Givet mine selects er der derfor stor forskel på om
mit
> index er systemid+timecode istedet for timecode+systemid. Det kan man se
> direkte i en explain, da denne ender op med langt flere rows med
> timecode+systemid end systemid+timecode. Det aktuelle index kan f.eks. på
> mit arbejde levere en måneds data i løbet af et par sekunder, mens det
> omvendte index, timecode+systemid, tager over 4 minutter og bruger en
masse
> CPU.

ok god forklaring, det kan jeg evt bruge til noget da den største de af
databasen er vores forum. Tabellen med svar har efterhånden rundet 750.000
svar så der er en del records den skal søge igennem for at finde ting frem.

> Det er muligvis i underkanten. MySQL i den normale udgave (på unix
> ihvertfald) er meget spartansk konfigureret per default, saa den kan klare
> sig med meget lidt RAM. Det koster naturligvis i performance hvis
databasen
> er stor.
> Der er eksempler på alternative konfigurations-filer. De ligger i MySQL's
> $HOME directory under :
>
> share/mysql/my-small.cnf
> share/mysql/my-medium.cnf
> share/mysql/my-large.cnf
> share/mysql/my-huge.cnf
>
> Default for MySQL er vist my-small.cnf
> Jeg bruger som regel my-large.cnf hjemme og my-huge.cnf på mit arbejde.

ok hvor store er de databaser du arbejder med? min database har en samlet
størrelse på 366 MB og den største tabel er på omkring 300 MB (tabellen med
forum svar fra før).

Lige nu kører serveren rigtigt godt, det index jeg slettede må have været
ret defekt for det hjalp rigtigt meget at slette det.

Men du skal have tak for dine råd med hensyn til serveren jeg vil tage dem
ti lmig og prøve at oprimere ydelsen endnu mere.


--
Med venlig hilsen
Thomas Eriksen

http://www.hardwareonline.dk 24 Hour Hardware Portal.



Jesper Frank Nemholt (06-02-2003)
Kommentar
Fra : Jesper Frank Nemholt


Dato : 06-02-03 09:16

"Thomas Eriksen" <thomas@hardwareonline.dk> wrote in message
news:3e41a5ea$0$24719$ba624c82@nntp02.dk.telia.net...
> "Jesper Frank Nemholt" <jfn@dassic.com> skrev i en meddelelse
> news:b1qi09$pi2$1@sunsite.dk...
>
[clip]
> ok god forklaring, det kan jeg evt bruge til noget da den største de af
> databasen er vores forum. Tabellen med svar har efterhånden rundet 750.000
> svar så der er en del records den skal søge igennem for at finde ting
frem.

750000 er nu ikke alverden, men det afhænger af størrelsen.

> > Det er muligvis i underkanten. MySQL i den normale udgave (på unix
> > ihvertfald) er meget spartansk konfigureret per default, saa den kan
klare
> > sig med meget lidt RAM. Det koster naturligvis i performance hvis
> databasen
> > er stor.
> > Der er eksempler på alternative konfigurations-filer. De ligger i
MySQL's
> > $HOME directory under :
> >
> > share/mysql/my-small.cnf
> > share/mysql/my-medium.cnf
> > share/mysql/my-large.cnf
> > share/mysql/my-huge.cnf
> >
> > Default for MySQL er vist my-small.cnf
> > Jeg bruger som regel my-large.cnf hjemme og my-huge.cnf på mit arbejde.
>
> ok hvor store er de databaser du arbejder med? min database har en samlet
> størrelse på 366 MB og den største tabel er på omkring 300 MB (tabellen
med
> forum svar fra før).

Mine MySQL baser er en anelse større, sådan cirka 100-200 gange større.
Oracle baserne er typisk > 1 TB. Den største er på omkring 15 så vidt jeg
husker.

366 MB er jo reelt hvad maskinen givetvis kan have liggende i RAM, så det er
ikke disk I/O eller problemer med caching der driller dig, det er simpelthen
den reelle søge/sorterings-tid.

> Lige nu kører serveren rigtigt godt, det index jeg slettede må have været
> ret defekt for det hjalp rigtigt meget at slette det.

Det vil givetvis hjælpe ufatteligt meget mere at få smidt et korrekt index
på. Hvis du ikke har index eller keying på pt. skal MySQL gennemsøge alle
300 MB i den store tabel hver gang.
....men det afhænger meget af hvordan tabellen er lavet og hvordan du søger i
den. Man kan sagtens lave en tabel der er svær at lave et godt index på.....
i de tilfælde bør man overveje at opsplitte tabellen (normalisere den).
F.eks. kunn du i din muligvis tage det tunge (i størrelse) ud af din store
tabel og placere det i en seperat tabel og så referere til den via keys og
så søge i en lille som så blot returnerer key til den store.

/Jesper



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408926
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste