MySQL langsamer als MSAccess

MySQL langsamer als MSAccess

am 05.09.2007 00:46:15 von unknown

Post removed (X-No-Archive: yes)

Re: MySQL langsamer als MSAccess

am 05.09.2007 01:19:16 von unknown

Post removed (X-No-Archive: yes)

Re: MySQL langsamer als MSAccess

am 05.09.2007 02:16:52 von unknown

Post removed (X-No-Archive: yes)

Re: MySQL langsamer als MSAccess

am 05.09.2007 06:37:46 von unknown

Post removed (X-No-Archive: yes)

Re: MySQL langsamer als MSAccess

am 05.09.2007 06:44:24 von unknown

Post removed (X-No-Archive: yes)

Re: MySQL langsamer als MSAccess

am 05.09.2007 08:57:15 von Andreas Kretschmer

Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de

Re: MySQL langsamer als MSAccess

am 05.09.2007 09:26:53 von Claus Reibenstein

Chris Leick schrieb:

> mir ist etwas interessantes aufgefallen: Wenn ich zwei gleiche Datenbanken
> auf dem gleichen Linux-Server liegen habe ist eine MS-Access-Datenbank, die
> dort auf einem Samba-Share liegt ungefähr doppelt so schnell wie eine
> MySQL5-DB.

Welches Access? Welches MySQL? Welche DB-Engine? Konfiguration?
Tabellenstruktur? Indizes?

> Im vorliegenden Fall selectierte ich ca 8000 Datensätze und
> benötigte bei MySQL 9s und auf Access 5s.

Wieviel Millionen Datensätze haben Deine Tabellen?

> Das Select sieht so aus:
> SELECT a.Feld1, a.Feld2, b.Feld3, c.Feld4, c.Feld5, c.Feld6, c.ID
> FROM a INNER JOIN b ON a.ID=b.ID
> INNER JOIN c ON a.ID=c.ID
> WHERE c.Feld4>=20000
> AND c.Feld5 <=40000
> ORDER BY c.Feld4 DESC

Was sagt denn EXPLAIN zu dieser Query?

> Auch das Weglassen der JOINs durch
> ....WHERE a.ID=b.ID AND a.ID=c.ID...
> brachte keinen Geschwindigkeitszuwachs.

Das hätte mich auch gewundert. Schließlich ist das nur eine andere
Schreibweise für (INNER) JOINs.

> Kann man das irgendwie optimieren, damit es auf MySQL schneller wird oder
> gibt es Einstellungen, die mein MySQL ausbremsen könnten?

Es gibt _viele_ Einstellungen, mit denen man MySQL flotter bekommt (oder
ausbremsen kann). Welche für Dich sinnvoll sind, hängt vom Einsatzzweck
der Datenbank und den vorhandenen Hardware-Ressourcen ab.

Gruß. Claus

Re: MySQL langsamer als MSAccess

am 05.09.2007 09:34:55 von Andreas Kretschmer

Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de

Re: MySQL langsamer als MSAccess

am 05.09.2007 10:10:05 von Claus Reibenstein

Chris Leick schrieb:

> Andreas Kretschmer schrieb:
>
>> Nimm gleich Access. So viel schlimmer als MySQL kann es auch nicht sein.

Typisch Andreas Kretschmer.

Lass Dich von seinen "sachlichen" Argumenten bloß nicht einlullen. Für
den ist PostgreSQL die einzig wahre Datenbank und alles andere nur Scheiße.

Ich frage mich schon lange, was er eigentlich hier will.

> Davon wollte ich gerade weg und hatte gehofft hier ein paar Tipps zu
> erhalten, wie man MySQL beschleunigen kann. Da ich komplett von M$-Software
> weg will muss ich mich wohl nach einer anderen DB (oder einem
> anderen "Zettelkasten ;-) ) umsehen.

Dann bist Du bei MySQL schon ganz gut aufgehoben.

Gruß. Claus

Re: MySQL langsamer als MSAccess

am 05.09.2007 13:07:44 von Thomas Rachel

Chris Leick schrieb:

> Tabelle c hat einen Index über die Felder 4 und 5

Der aber laut dem unten gezeigten EXPLAIN nicht genutzt wird.


> Millionen? Nein. Die komplette DB hat 25.000 Datensätze. Die an meinem
> SELECT beteiligten Tabellen zusammen gerade mal 5000.

Die sich aber nicht addieren, sondern multiplizieren (s.u., EXPLAIN)


>>> Das Select sieht so aus:
>>> SELECT a.Feld1, a.Feld2, b.Feld3, c.Feld4, c.Feld5, c.Feld6, c.ID
>>> FROM a INNER JOIN b ON a.ID=b.ID
>>> INNER JOIN c ON a.ID=c.ID
>>> WHERE c.Feld4>=20000
>>> AND c.Feld5 <=40000
>>> ORDER BY c.Feld4 DESC

Da fehlen Indizes auf a.ID, b.ID und c.ID. Leg die mal an und zeig uns
dann Dein EXPLAIN.


>> Was sagt denn EXPLAIN zu dieser Query?
>
> 1 a SIMPLE ALL NULL NULL NULL NULL 6 using temporary;using filesort
> 1 b SIMPLE ALL NULL NULL NULL NULL 189
> 1 c SIMPLE ALL F45 NULL NULL NULL 5113 using where
>
> (F45 ist der Index über die Felder 4 und 5)
>
> [...]
>
> Die Hardware ist leider nicht so toll, daher versuche ich auch
> herumzuoptimieren.

Da ist noch einiges an Optimierungspotential...


HTH,

Thomas

Re: MySQL langsamer als MSAccess

am 05.09.2007 13:24:22 von Claus Reibenstein

Chris Leick schrieb:

> Claus Reibenstein schrieb:
>
>> Chris Leick schrieb:
>>
>>> [MS-Access schneller als MySQL]
>>
>> Tabellenstruktur? Indizes?
>
> INNOBD
> Tabelle c hat einen Index über die Felder 4 und 5
>
>>> Im vorliegenden Fall selectierte ich ca 8000 Datensätze und
^^^^

>> Wieviel Millionen Datensätze haben Deine Tabellen?
>
> Millionen? Nein. Die komplette DB hat 25.000 Datensätze. Die an meinem
> SELECT beteiligten Tabellen zusammen gerade mal 5000.
^^^^

Da passt was nicht zusammen ;-)

Bei dieser Datenbankgröße sind 9 Sekunden entschieden zu lang.

>>> Das Select sieht so aus:
>>> SELECT a.Feld1, a.Feld2, b.Feld3, c.Feld4, c.Feld5, c.Feld6, c.ID
>>> FROM a INNER JOIN b ON a.ID=b.ID
>>> INNER JOIN c ON a.ID=c.ID
>>> WHERE c.Feld4>=20000
>>> AND c.Feld5 <=40000
>>> ORDER BY c.Feld4 DESC

Du joinst über a.ID, b.ID und c.ID. Hier solltest Du mal jeweils einen
Index drauf setzen.

>> Was sagt denn EXPLAIN zu dieser Query?
>
> 1 a SIMPLE ALL NULL NULL NULL NULL 6 using temporary;using filesort
> 1 b SIMPLE ALL NULL NULL NULL NULL 189
> 1 c SIMPLE ALL F45 NULL NULL NULL 5113 using where

Also ein voller Tablescan über alle 3 Tabellen.

> (F45 ist der Index über die Felder 4 und 5)

Der wird aber gar nicht benutzt.

Mach aus diesem Index doch mal zwei Indizes, für jede der Spalten einen
eigenen. Vielleicht hilft das schon.

>>> Auch das Weglassen der JOINs durch
>>> ....WHERE a.ID=b.ID AND a.ID=c.ID...
>>> brachte keinen Geschwindigkeitszuwachs.
>>
>> Das hätte mich auch gewundert. Schließlich ist das nur eine andere
>> Schreibweise für (INNER) JOINs.
>
> Seit SQL92 soll man zweiteres nicht mehr machen, oder?

Warum? Wer sagt das?

Gruß. Claus

Re: MySQL langsamer als MSAccess

am 05.09.2007 14:11:09 von Axel Schwenke

Chris Leick wrote:
>
> INNOBD
> Tabelle c hat einen Index über die Felder 4 und 5
>
>>> SELECT a.Feld1, a.Feld2, b.Feld3, c.Feld4, c.Feld5, c.Feld6, c.ID
>>> FROM a INNER JOIN b ON a.ID=b.ID
>>> INNER JOIN c ON a.ID=c.ID
>>> WHERE c.Feld4>=20000
>>> AND c.Feld5 <=40000
>>> ORDER BY c.Feld4 DESC
>>
>> Was sagt denn EXPLAIN zu dieser Query?
>
> 1 a SIMPLE ALL NULL NULL NULL NULL 6 using temporary;using filesort
> 1 b SIMPLE ALL NULL NULL NULL NULL 189
> 1 c SIMPLE ALL F45 NULL NULL NULL 5113 using where
>
> (F45 ist der Index über die Felder 4 und 5)

Jo. Und weitere Indexe gibts nicht. Nach obigem Plan baut MySQL eine
temporäre Tabelle mit 5113*189*6 ~= 5.800.000 Zeilen, ackert die durch
um alles rauszuschmeißen, was das WHERE nicht erfüllt und sortiert das
Ergebnis.

ALTER TABLE a ADD INDEX (ID)
ALTER TABLE b ADD INDEX (ID)
ALTER TABLE c ADD INDEX (ID)

Falls die ID-Felder eindeutig sind (was man beim Namen ID eigentlich
erwartet, kommt vor INDEX noch UNIQUE).

Danach sollte MySQL schneller sein.


XL

Re: MySQL langsamer als MSAccess

am 05.09.2007 16:03:43 von Axel Schwenke

Chris Leick wrote:
> Axel Schwenke schrieb:
>> Chris Leick wrote:
>>>
>> ALTER TABLE a ADD INDEX (ID)
>> ALTER TABLE b ADD INDEX (ID)
>> ALTER TABLE c ADD INDEX (ID)
>>
>> Falls die ID-Felder eindeutig sind (was man beim Namen ID eigentlich
>> erwartet, kommt vor INDEX noch UNIQUE).
>>
>> Danach sollte MySQL schneller sein.
>
> Stimmt. Vielen Dank. Die Indexe gingen wohl beim Export aus Access verloren.
> Nachdem ich die angelegt habe ist das SELECT in 1,5s fertig.

Noch was. Da das InnoDB ist, bringt es was darüber nachzudenken,
was man als PRIMARY KEY verwendet. Wenn ID unique ist, dann auf
jeden Fall den PRIMARY KEY auf ID setzen.


XL

Re: MySQL langsamer als MSAccess

am 06.09.2007 07:24:30 von unknown

Post removed (X-No-Archive: yes)

Re: MySQL langsamer als MSAccess

am 06.09.2007 10:37:10 von Claus Reibenstein

Chris Leick schrieb:

> Claus Reibenstein schrieb:
>
>> Du joinst über a.ID, b.ID und c.ID. Hier solltest Du mal jeweils einen
>> Index drauf setzen.
>
> Habe ich nun getan und bin damit schon auf 1,5 Sek. runter.

Na siehste :-)

Nur mal so interessehalber: Hast Du zum Vergleich das auch mal mit
Access probiert?

>> Chris Leick schrieb:
>>
>>> (F45 ist der Index über die Felder 4 und 5)
>>
>> Mach aus diesem Index doch mal zwei Indizes, für jede der Spalten einen
>> eigenen. Vielleicht hilft das schon.
>
> Habe es mal getestet. Das scheint nichts zu bewirken.

Was sagt EXPLAIN (bitte die Kopfzeilen stehen lassen)?

>>> Seit SQL92 soll man zweiteres nicht mehr machen, oder?
>>
>> Warum? Wer sagt das?
>
> Mmmh. Habe das geim Googlen nach INNER JOIN entdeckt:
> http://ugpl.de/?q=node/1134

Da steht aber nirgends, dass man die alte Schreibweise nicht mehr
verwenden soll, geschweige denn warum. Ich wüsste auch keinen Grund.

Gruß. Claus

Re: MySQL langsamer als MSAccess

am 06.09.2007 16:09:39 von Axel Schwenke

Chris Leick wrote:
> Claus Reibenstein schrieb:
>>
>> Was sagt EXPLAIN (bitte die Kopfzeilen stehen lassen)?
>
> id select_type table type possible_keys key key_len ref rows
> 1 SIMPLE a ALL K4,K5 NULL NULL NULL 8101
> 1 SIMPLE b ALL PRIMARY NULL NULL NULL 5
> 1 SIMPLE c eq_ref PRIMARY,ID PRIMARY 4 My.a.ID 1
>
> extra
> Using where; Using Temporary; Using filesort
> Using where

Jetzt könnte man mal probieren ob es was nützt, die Benutzung des
Index auf (c.Feld4, c.Feld5) zu erzwingen.

SELECT a.Feld1, a.Feld2, b.Feld3, c.Feld4, c.Feld5, c.Feld6, c.ID
FROM a INNER JOIN b ON a.ID=b.ID
INNER JOIN c USE INDEX (F45) ON a.ID=c.ID
WHERE c.Feld4>=20000
AND c.Feld5 <=40000
ORDER BY c.Feld4 DESC

Und wenn die Query unverändert gegen Access und MySQL laufen soll,
schachtelt man das USE INDEX () noch in einen magischen Kommentar:

.... /*! USE INDEX (F45) */ ...


XL

Re: MySQL langsamer als MSAccess

am 06.09.2007 18:15:04 von Claus Reibenstein

Chris Leick schrieb:

> Claus Reibenstein schrieb:
>
>> Chris Leick schrieb:
>>
>>> Claus Reibenstein schrieb:
>>>
>>>> Du joinst über a.ID, b.ID und c.ID. Hier solltest Du mal jeweils einen
>>>> Index drauf setzen.
>>>
>>> Habe ich nun getan und bin damit schon auf 1,5 Sek. runter.
>>
>> Na siehste :-)
>>
>> Nur mal so interessehalber: Hast Du zum Vergleich das auch mal mit
>> Access probiert?
>
> Dort gibt es den Index sowieso. Er ist mir nur bein Datenexport verlustig
> gegangen.

Dann ist ja wohl alles klar. Vor allem, warum Access schneller war und
es jetzt nicht mehr ist :-)

Gruß. Claus