Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Optymalizacja zapytania SQL
tuptak6
post
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

  1. SELECT m.*, mc.*, l.*,
  2.  
  3. (SELECT GROUP_CONCAT(cc.cat_name)
  4. FROM category_movies cc, movies_cats mm
  5. WHERE mm.movie = m.movie_id
  6. AND cc.cat_id = mm.cat ) AS moviecat_names,
  7.  
  8. (SELECT GROUP_CONCAT(cc.cat_id)
  9. FROM category_movies cc
  10. LEFT JOIN movies_cats mm ON ( cc.cat_id = mm.cat )
  11. WHERE mm.movie = m.movie_id ) AS moviecat_ids,
  12.  
  13. (SELECT GROUP_CONCAT(lang)
  14. FROM links_movies
  15. WHERE movie = m.movie_id
  16. GROUP BY lang) AS lang_ids
  17.  
  18. FROM movies m, movies_cats mc , links_movies l
  19. WHERE m.movie_id = mc.movie
  20. AND m.movie_year >= '1900'
  21. AND m.movie_year <= '2012'
  22. AND m.movie_rate >= '0'
  23. AND m.movie_rate <= '10'
  24. AND m.movie_id = l.movie
  25. AND l.lang IN (1)
  26. AND mc.cat IN (1)
  27. GROUP BY mc.movie
  28. ORDER BY m.movie_title ASC
  29. LIMIT 0,10


Wszystko było by ładnie pięknie ale strona się ładuje bardzo długo
Czy pomoże mi ktoś to ogarnąć ?

Pozdrawiam
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
alegorn
post
Post #2





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
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 8.10.2025 - 20:02