jarmiar
22.03.2012, 14:14:05
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ś
22.03.2012, 14:16:08
No to spróbuj na UNION ALL-a zobaczysz różnice.
nospor
22.03.2012, 14:20:32
@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
22.03.2012, 14:27:51
powinna byc roznica.
podaj nam jeszcze jesli mozna prosic sqlki jakie uzyles - moze nedzie mozna cos wiecej wywnioskowac..
j.
Niktoś
22.03.2012, 14:30:09
nospor
22.03.2012, 14:35:19
A ty jak zwykle na teorii...
Spójrz na problem. Dla 4tys rekordów union ALL ci nic nie da.
Niktoś
22.03.2012, 14:39:55
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
22.03.2012, 14:42:15
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ś
22.03.2012, 14:44:08
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
jarmiar
22.03.2012, 15:05:51
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.pngPierwszy fragment tyczy się OR, drugi UNION
nospor
22.03.2012, 15:08:51
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.