Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: optymalizacja where ... or ...
Forum PHP.pl > Forum > Bazy danych > MySQL
jarmiar
Ponoć lepiej rozbić OR w klauzuli WHERE na UNION SELECT, aby zapytanie szybciej się wykonywało.
Przeprowadziłem więc testy. Szybciej wykonywało się zapytanie, w którym w klauzuli WHERE był OR aniżeli to z UNION SELECT.
Czy to rozwiązanie jest optymalne w przypadku dużej ilości rekordów? (testy przeprowadzałem na ok 4 tyś rekordów)
Niktoś
No to spróbuj na UNION ALL-a zobaczysz różnice.
nospor
@Niktoś a niby co to ma poprawić? Przecież ALL nie wpływa na szybkość tylko na sposób zwracania danych

@jarmiar to może podaj strukture tabeli, indeksy, zapytanie które masz.
użyj też EXPLAIN by sprawdzić co się dzieje
alegorn
powinna byc roznica.

podaj nam jeszcze jesli mozna prosic sqlki jakie uzyles - moze nedzie mozna cos wiecej wywnioskowac..
j.
Niktoś
http://pl.wikipedia.org/wiki/Operator_Union
http://stackoverflow.com/questions/3374459...joins-just-suck

To powinno wyjaśnić dlaczego union all jest szybszy od union i join z or
nospor
A ty jak zwykle na teorii...

Spójrz na problem. Dla 4tys rekordów union ALL ci nic nie da.
Niktoś
Powinno nieznacznie pszyspieszyć.Autor tego tematu przeprowadza testy,to ja zaproponowałem przeprowadzenie dodatkowo testów z union all, może akurat będzie wydajniej.
nospor
Nie będzie. DLa 4tys nie będzie żadnej różnicy, a nawet jak będzie to będzie to różnica na poziomie milisekund i to nie koniecznie na korzyść union all.

Żeby tu rozwiązać problem to trzeba zobaczyć jakie są indeksy, co zwraca EXPLAIN. Co z tego ze da UNION, jeśli indeksy ma do 4 liter i zamiast jednego wolnego zapytania to z UNION będzie miał dwa wolne zapytania a przez co będzie działało dłużej.

Nie kłóćmy się więc o głupoty tylko poczekajmy na dane.
Niktoś
Cytat
Nie kłóćmy się więc o głupoty tylko poczekajmy na dane.

Racja, ja się nie kłócę ,dałem propozycję,poza tym sam jestem ciekaw wink.gif
jarmiar
Testy przeprowadzałem najpierw bez indeksów a potem z indeksami. Oczywiście w przypadku indeksów zapytania (oba) wykonywały się nieco szybciej, jednak nadal UNION zostawał w tyle.

Bez indeksów:

OR: 0,0060

UNION: 0,1365

Po nałożeniu indeksów:

OR: 0,0045
UNION: 0,1325

Załączam screena po EXPLAIN:

http://s4.ifotos.pl/img/screenpng_rnrseen.png

Pierwszy fragment tyczy się OR, drugi UNION
nospor
Kiepskie masz te indeksy skoro widać jak wół, że ani razu nie zostały użyte.
Jak mówiłem: jak nie ma indeksów to UNION nigdy nie będzie szybsze bo zamiast jednego wolnego zapytania musi zrobić dwa wolne zapytania....
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.