Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Rozbudowane zapytania SQL
Forum PHP.pl > Forum > Bazy danych
Fluke
Witam,

Mam takie pytanie o rozbudowanych zapytaniach SQL. Szczerze mówiąc nie widziałem za wiele zapytań kogoś innego więc chciałbym spytać się was. Zrobiłem sobie relacyjną bazę danych z kilkoma tabelami(nie będę się tu rozpisywał na ich temat).

Mam taki kod SQL:
  1. SELECT
  2. controller.*,
  3. controller_module.*,
  4. widget_used.Params,
  5. widget.Filename,
  6. widget.Name AS WidgetName,
  7. widget.Description,
  8. location_type.Name
  9. FROM
  10. controller AS controller
  11. LEFT JOIN
  12. controller_module AS controller_module
  13. ON controller_module.Id = controller.Id
  14. LEFT JOIN
  15. controller_widget AS controller_widget
  16. ON controller_widget.IdController = controller.Id
  17. LEFT JOIN
  18. widget_used AS widget_used
  19. ON controller_widget.IdWidgetUsed = widget_used.Id
  20. LEFT JOIN widget AS widget
  21. ON widget.Id = widget_used.IdWidget
  22. LEFT JOIN layout_location AS layout_location
  23. ON layout_location.Id = controller_widget.IdLayoutLocation
  24. LEFT JOIN location AS location
  25. ON layout_location.IdLocation = location.Id
  26. LEFT JOIN location_type AS location_type
  27. ON location.`Type` = location.Id
  28. WHERE
  29. controller_module.Name = "website" AND
  30. location_type.Name = "widget" AND
  31. location.Name = "primary"


Żeby wyciągnąć wyniki które mnie interesują, muszę użyć takiego zapytania.
Czy tak wiele join`ów może być w jednym zapytaniu czy istnieje jakaś inna metoda aby tego ominąć questionmark.gif
Gdy wykonuję to zapytanie to czas osiąga: 0.0011 sekundy więc mało ale gdy będę miał więcej danych to na pewno będzie osiągał dużo więcej tylko czy z tymi join`ami nie będzie rosło wykładniczo.

Pozdrawiam
alegorn
relacyjne bazy danych mają to że dobrze pracują z relacjami.
przy prawidłowo zbudowanej bazie danych nie ma się co bać łączenia nawet wielu tabel.


kwestią osobną jest prawidłowe pisanie zapytań.

na początek powinieneś wybierać tabele które maksymalnie ograniczają ilość wierszy (czyli to co masz w sekcji where)

poza tym zerknij na to:
  1. LEFT JOIN location_type AS location_type
  2. ON location.`Type` = location.Id

tu masz skopane łączenie z tą tabelą.. nie wskazujesz żadnego pola do tej tabeli...

tak naprawdę zrób explain na zapytaniu. prawidłowe będzie korzystało przy każdym połączeniu z odpowiednich kluczy, poczytaj sobie jak rozumiec wynik explain - to naprawde pomaga

j.
Marcineczeczek
Cytat(alegorn @ 28.08.2012, 10:55:59 ) *
tak naprawdę zrób explain na zapytaniu. prawidłowe będzie korzystało przy każdym połączeniu z odpowiednich kluczy, poczytaj sobie jak rozumiec wynik explain - to naprawde pomaga


explain to podstawa - co mi się nie podoba w tym pytaniu to ogromna ilość operatorów = na stringach

np.

controller_module.Name = "website" AND
location_type.Name = "widget" AND
location.Name = "primary"

to nie będzie wydajne chyba że załozych hash indexy, ale znowu zalezy ile tam masz rekordów.

Mam wrażenie że da się przemysleć i zoptymalizować strukture bazodanową to w 99% pozwala oszczedzić czas.

Aha testy rób po wpakowaniu przynajmniej kilkutysięcy rekordów bo że na 10 się szybko wykonuje to nie dziwota (szczególnie jak je sobie wrzuci do cache).

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.