Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Rozbudowane zapytania SQL
Fluke
post 27.08.2012, 15:57:02
Post #1





Grupa: Zarejestrowani
Postów: 247
Pomógł: 9
Dołączył: 20.09.2010
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
alegorn
post 28.08.2012, 09:55:59
Post #2





Grupa: Zarejestrowani
Postów: 341
Pomógł: 40
Dołączył: 23.06.2009

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Marcineczeczek
post 5.09.2012, 09:35:02
Post #3





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 4.09.2012

Ostrzeżenie: (0%)
-----


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).



--------------------
Jeśli interesują Cię sklepy internetowe i porady z tego tematu to zapraszam na www.sklepy-internetowe.pl.
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 9.05.2025 - 08:42