![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 14 Pomógł: 1 Dołączył: 11.06.2012 Ostrzeżenie: (0%) ![]() ![]() |
Witam
Po wielu próbach udało mi się napisać zapytanie które spełnia wszystkie moje warunki i wyświetla wszystkie potrzebne dane: Przykład z wszystkimi warunkami i uzupełnionymi danymi
Wszystko było by ładnie pięknie ale strona się ładuje bardzo długo Czy pomoże mi ktoś to ogarnąć ? Pozdrawiam |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 915 Pomógł: 210 Dołączył: 8.09.2009 Skąd: Tomaszów Lubelski/Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Zamiast subselectów spróbój zastosować JOINy. Jakie masz indeksy w tej bazie? Co pokazuje EXPLAIN?
|
|
|
![]()
Post
#3
|
|
Grupa: Przyjaciele php.pl Postów: 2 605 Pomógł: 96 Dołączył: 22.10.2004 Skąd: UK Ostrzeżenie: (0%) ![]() ![]() |
Zobacz co mówi EXPLAIN, zobacz czy masz pozakładane poprawnie indeksy.
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 1 879 Pomógł: 230 Dołączył: 20.03.2005 Skąd: Będzin Ostrzeżenie: (0%) ![]() ![]() |
Miałem ostatni tak sam problem.
Zapytanie normalnie działało mi super, szybko, ale dodając jedną tabelę za dużo, nagle ładowanie strony przekroczyło nawet cierpliwość programisty. Wystarczyło zastosować dla odpowiednich tabel JOIN LEFT,RIGHT lub OUTER i zapytanie się przyśpieszyło jeszcze lepiej. Więc teraz mam w jednym zapytaniu i subselecty, i joiny. |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 14 Pomógł: 1 Dołączył: 11.06.2012 Ostrzeżenie: (0%) ![]() ![]() |
Dodałem indexy i zapytanie śmiga szybko
Nowy explain: (IMG:http://fooh.pl/pokaz/1715625708.jpg) Ale czy jest jakaś jeszcze opcja optymalizacji ? Ten post edytował tuptak6 18.07.2012, 14:20:39 |
|
|
![]()
Post
#6
|
|
Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Orzeszku... Nie prościej było to pojoinować? Z tego co widzę, bierzesz filmy i wyciągasz wszystkie kategorie filmu, id tych kategorii i coś z językami oraz linkami (nie znam struktur tabel). Do tego w where zamiast tylu AND można by zakresy trzasnąć w BETWEEN. No i te "using temporary" źle wróży na przyszłość przy twoim iloczynie kartezjańskim na 3 tabelach.
|
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 14 Pomógł: 1 Dołączył: 11.06.2012 Ostrzeżenie: (0%) ![]() ![]() |
W takim razie jak pozbyć się "Using temporary;" ?
Ten post edytował tuptak6 19.07.2012, 12:54:15 |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 341 Pomógł: 40 Dołączył: 23.06.2009 Ostrzeżenie: (0%) ![]() ![]() |
jesli masz w zapytaniu order by - wymuszasz poniekad stosowanie tabel tymczasowych.
nie zawsze sie da uniknac tempa. i nie zawsze jest to problem dla zapytania. problem pojawia sie wtedy - gdy ilosc danych jaka zapisujesz do tempa - przekracza dostepnej pamieci (ramu), wtedy nastepuje to co najgorsze - zapis na dysk. rada? ograniczaj maksymaline ilosc danych, do momentu w ktorym masz sortowac dane. (jesli wrecz nie zrezygnowac z sortowania) czasem, lepszym rozwiazaniem jest wlasne przygotowanie tabeli tymczasowej. z pozakladanymi odpowiednimi indeksami mozna uzyskac rewelacyjne czasy dostepu. pamietajac ze innodb domyslnie sortuje wg najwazniejszego indeksu - nie wg kolejnosci dodania - da sie uzyskac tabele z posortowanymi danymi gotowa do natychmiastowego uzycia czasem, przy tworzeniu takich tymczasowych tabel, warto sie zaineresowac silnikiem memory. zajmuje ram - ale daje rewelacyjne czasy (IMG:style_emoticons/default/wink.gif) (oczywiscie wczesniej poczytaj co oznacza wybor tego silnika!) j. |
|
|
![]()
Post
#9
|
|
Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
@alegorn: Zwróć uwagę na ilość przy explain. 890 rekordów i temporary table już? To znaczy, że tu już coś może być lekko nie tak. I zauważ, że tak jest. Bez dokładnej struktury tabel oczywiście nie powiem tego na 100%, ale moim zdaniem większość podzapytań można by po prostu dodać z użyciem JOIN, które potem się pogrupuje.
|
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 341 Pomógł: 40 Dołączył: 23.06.2009 Ostrzeżenie: (0%) ![]() ![]() |
tutaj temporary jest potrzebne dla sortowania. koniec kropka.
nie jest ważne ile masz tam rekordów (10 czy 1k) zauwaz ze jest tutaj razem z filesort, jest to potrzebne do wykonania tej operacji. tutaj, po wielu filtrowaniach/relacjach itp. silnik wybral odpowiednie rekordy z wielu źródeł. ostatnią operacją jest posortowanie tego i zwrot. by to wykonać - silnik pakuje to do tempa i wykonuje sortowanie (order by)i porcjowanie (limit) zauważ, że ilekroć będziesz używał order by - będziesz miał w explainie: using temporary (przynajmniej wiecej niz 90%, dla joinowanych tabel) to ze tutaj da sie przebudować to zapytanie? zgoda! ze da się napisać lepiej? jasne! czy da się uniknąć tempa? niekoniecznie. poza tym jak napisałem, póki wielkość danych w tempie nie przekracza wartości krytycznej - (tzn nie wymusza zapisu na dysk) to wielka tragedia się nie dzieje. dlatego powinno się maksymalnie ograniczać ilość wierszy i kolumn. j. edit: literówka Ten post edytował alegorn 19.07.2012, 16:08:52 |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 14 Pomógł: 1 Dołączył: 11.06.2012 Ostrzeżenie: (0%) ![]() ![]() |
To co mam zrobić dalej ?
Powiem tak każdy warunek jest uzależniony od parametru w adresie URL. Dlatego chociażby z tego powodu BETWEEN, nie jest możliwy. Podobnie będzie z joinami nie zawsze wykorzystywane są wszystkie tabele. Gdy np user chce linki z lektorem to wtedy dodawana jest trzecia tabela links_movie a normalnie jej nie ma. Wszystko zależy od warunków. Wyżej podałem pełne zapytanie z wszystkimi warunkami |
|
|
![]()
Post
#12
|
|
Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
A nie pomyślałeś o jakimkolwiek query builderze? Poza tym chyba składanie zapytania na podstawie parametrów nie jest trudne aż tak? Kwestia tylko odpowiedniego IF-owania i dokładania elementów do zapytania. Jeśli dobrze to przemyślisz to naprawdę nie jest problemem to.
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 24.08.2025 - 15:50 |