Performance Steigerung bei WHERE-Sortierung?
Performance Steigerung bei WHERE-Sortierung?
am 26.10.2006 10:38:22 von Ricardo Wickel
Morgen NG,
Macht es einen Performanceunterschied, wenn man die WHERE Bedingungen so
anordnet, dass sie bereits am Anfang möglichst viel ausschlieÃen?
z.B.:
WHERE
authorid = '$aAuthorID' AND
activated = 1
anstatt von:
WHERE
activated = 1 AND
authorid = '$aAuthorID' AND
mfg,
Ricardo Wickel
--
http://doppeltgedacht.de/ | Weblog
http://wiky.de/ | Privat
http://ql-webdesign.de/ | Webdesign/ Programmierung
Re: Performance Steigerung bei WHERE-Sortierung?
am 26.10.2006 10:42:07 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: Performance Steigerung bei WHERE-Sortierung?
am 27.10.2006 14:41:10 von Werner Bauer
Ricardo Wickel schrieb:
> Morgen NG,
>=20
> Macht es einen Performanceunterschied, wenn man die WHERE Bedingungen s=
o=20
> anordnet, dass sie bereits am Anfang möglichst viel ausschlieÃ=
en?
>=20
> z.B.:
> WHERE
> authorid =3D '$aAuthorID' AND
> activated =3D 1
>=20
> anstatt von:
> WHERE
> activated =3D 1 AND
> authorid =3D '$aAuthorID' AND
Nein.
im Ãbrigen ist die Antwort vom Kretschmer eher unerheblich, was die =
Nutzung von Mysql betrifft.
Re: Performance Steigerung bei WHERE-Sortierung?
am 27.10.2006 15:21:58 von Axel Schwenke
Ricardo Wickel wrote:
>
> Macht es einen Performanceunterschied, wenn man die WHERE Bedingungen so
> anordnet, dass sie bereits am Anfang möglichst viel ausschlieÃen?
>
> z.B.:
> WHERE
> authorid = '$aAuthorID' AND
> activated = 1
>
> anstatt von:
> WHERE
> activated = 1 AND
> authorid = '$aAuthorID' AND
Nein, bei so einfachen Sachen nicht.
Bei komplexeren Bedingungen schon. Z.B. statt
.... WHERE SQRT((xpos-3)*(xpos-3) + (ypos-4)*(ypos-4)) <= 2
(Koordinaten (xpos, ypos) in einem Kreis mit Radius 2 um (3,4))
besser:
.... WHERE (xpos BETWEEN 1 and 5)
AND (ypos BETWEEN 2 AND 6)
AND ((xpos-3)*(xpos-3) + (ypos-4)*(ypos-4) <= 4)
-> der längliche Ausdruck muß nur für Punkte berechnet werden, die
innerhalb des umschließenden Quadrats liegen
-> ein Index auf (xpos, ypos) kann benutzt werden
-> die Wurzel kann man einsparen
XL
Re: Performance Steigerung bei WHERE-Sortierung?
am 27.10.2006 18:31:48 von newsgroup
Axel Schwenke schrieb:
> Ricardo Wickel wrote:
>
>>Macht es einen Performanceunterschied, wenn man die WHERE Bedingungen so
>>anordnet, dass sie bereits am Anfang möglichst viel ausschlieÃen?
>>
>>z.B.:
>>WHERE
>> authorid = '$aAuthorID' AND
>> activated = 1
>>
>>anstatt von:
>>WHERE
>> activated = 1 AND
>> authorid = '$aAuthorID' AND
>
>
> Nein, bei so einfachen Sachen nicht.
>
> Bei komplexeren Bedingungen schon. Z.B. statt
> ... WHERE SQRT((xpos-3)*(xpos-3) + (ypos-4)*(ypos-4)) <= 2
> (Koordinaten (xpos, ypos) in einem Kreis mit Radius 2 um (3,4))
>
> besser:
> ... WHERE (xpos BETWEEN 1 and 5)
> AND (ypos BETWEEN 2 AND 6)
> AND ((xpos-3)*(xpos-3) + (ypos-4)*(ypos-4) <= 4)
>
> -> der längliche Ausdruck muß nur für Punkte berechnet werden, die
> innerhalb des umschließenden Quadrats liegen
> -> ein Index auf (xpos, ypos) kann benutzt werden
> -> die Wurzel kann man einsparen
Du hast die Frage wohl falsch verstanden.
Ricardo wollte wissen, ob die REIHENFOLGE in der die Where-Bedingungen
notiert werden, relvant ist.
Und die Antwort darauf lautet: NEIN (zumindest bim aktuellen Optimizer).
Du hast auf eine andere Frage geantwortet.
((xpos-3)*(xpos-3) + (ypos-4)*(ypos-4) <= 4)
und
SQRT((xpos-3)*(xpos-3) + (ypos-4)*(ypos-4)) <= 2
ist nämlich aus der Sicht des Auschlussmenge exakt gleich.
So far,
Michael
Re: Performance Steigerung bei WHERE-Sortierung?
am 27.10.2006 23:09:39 von Kris
Axel Schwenke wrote:
> besser:
> ... WHERE (xpos BETWEEN 1 and 5)
> AND (ypos BETWEEN 2 AND 6)
> AND ((xpos-3)*(xpos-3) + (ypos-4)*(ypos-4) <= 4)
>
> -> der längliche Ausdruck muà nur für Punkte berechnet werden, die
> innerhalb des umschlieÃenden Quadrats liegen
> -> ein Index auf (xpos, ypos) kann benutzt werden
Ein WHERE x BETWEEN ... AND y BETWEEN ... nutzt nur einen Index auf x, wenn
ein BTREE bereitgestellt wird. Um x und y zu nutzen muss man einen RTREE
verwenden (und dazu (x,y) als GIS POINT TYPE bereit stellen).
Kris
Re: Performance Steigerung bei WHERE-Sortierung?
am 28.10.2006 08:42:50 von Andreas Kretschmer
Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)
Re: Performance Steigerung bei WHERE-Sortierung?
am 28.10.2006 10:31:16 von Werner Bauer
Kristian Köhntopp schrieb:
> Ein WHERE x BETWEEN ... AND y BETWEEN ... nutzt nur einen Index auf x, =
wenn
> ein BTREE bereitgestellt wird. Um x und y zu nutzen muss man einen RTRE=
E
> verwenden (und dazu (x,y) als GIS POINT TYPE bereit stellen).
kannst du das irgenwie näher erläutern? Mir ist soetwas äh=
nliches=20
bereits bei OR Abfrage aufgefallen - aber wie man einen r-tree=20
bereitstellt?
--=20
Werner
Re: Performance Steigerung bei WHERE-Sortierung?
am 28.10.2006 11:31:42 von Andreas Kretschmer
Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)
Re: Performance Steigerung bei WHERE-Sortierung?
am 28.10.2006 11:49:49 von Axel Schwenke
werner bauer wrote:
> Kristian Köhntopp schrieb:
>> Ein WHERE x BETWEEN ... AND y BETWEEN ... nutzt nur einen Index auf x, wenn
>> ein BTREE bereitgestellt wird. Um x und y zu nutzen muss man einen RTREE
>> verwenden (und dazu (x,y) als GIS POINT TYPE bereit stellen).
>
> kannst du das irgenwie näher erläutern? Mir ist soetwas ähnliches
> bereits bei OR Abfrage aufgefallen - aber wie man einen r-tree
> bereitstellt?
Ein R-Tree ->[1] ist ein mehrdimensionaler Index. MySQL verwendet
R-Trees für die Indizierung von Geodaten ->[2].
Das mit OR ist eine andere Geschichte. Vor 5.0 konnte der Query-Planner
von MySQL pro Tabelle nur einen Index benutzen. Z.B. WHERE x=1 OR y=42
benutzt entweder einen Index auf x oder einen auf y. Mit 5.x wurde
"index merging" ->[3] eingeführt, das diesen Teil optimiert.
[1] http://de.wikipedia.org/wiki/Rtree
[2] http://dev.mysql.com/doc/refman/5.0/en/spatial-extensions.ht ml
[3] http://dev.mysql.com/doc/refman/5.0/en/index-merge-optimizat ion.html
XL