![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 215 Pomógł: 19 Dołączył: 24.12.2003 Skąd: Przemyśl Ostrzeżenie: (0%) ![]() ![]() |
Witam
Mam w bazie danych zapisane kategorie gdzie tabela ta posiada między innymi takie nagłówki jak idCategories,idParent,name itp. Potrzebuję wyciągnąć wszystkie kategorie wraz z ich potomkami niezależnie od stopnia zagnieżdzenia aby potem móc zrobić sobie menu np. takie http://jquery.bassistance.de/treeview/demo/?1 czyli wszystkie elementy pociągnięte od razu a nie w trakcie kliknięcia na danego potomka. Wiec konstrukcje <ul> z zagłębieniami W tabeli kategorii jest około 1400 kategorii na chwilę obecną około 14 pierwszego poziomu czyli z idparent = 0, 165 drugiego i jakieś 1300 trzeciego poziomu. Elementy pobieram rekurencyjnie ale to nie jest za bardzo problemem a ilość pętli jaka musi być wykonana i jest ich w sumie w chwili obecnej około 240 000, czas wykonywania tej operacji to około 0,4 sekundy i tak nie mam za bardzo pomysłu co tu można jeszcze poprawić
Jakby ktoś miał jakis pomysł jak to zoptymalizować to byłbym wdzięczny. Pozdrawiam |
|
|
![]()
Post
#2
|
|
Grupa: Moderatorzy Postów: 8 989 Pomógł: 1550 Dołączył: 8.08.2008 Skąd: Słupsk/Gdańsk ![]() |
Zastosować inny rodzaj drzewa w bazie danych. Left right, bądź IP
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 215 Pomógł: 19 Dołączył: 24.12.2003 Skąd: Przemyśl Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#4
|
|
Grupa: Moderatorzy Postów: 8 989 Pomógł: 1550 Dołączył: 8.08.2008 Skąd: Słupsk/Gdańsk ![]() |
Jak już to:
1) Cache - dla każdego rodzica listę ich dzieci 2) Dlaczego pobierasz WSZYSTKIE elementy a dopiero potem je "wyszukujesz" w duzej tablicy? Załóż klucz "index" na pole "idParent" w swojej bazie i wyszukuj tylko te rekordy, które potrzebujesz |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 215 Pomógł: 19 Dołączył: 24.12.2003 Skąd: Przemyśl Ostrzeżenie: (0%) ![]() ![]() |
2) Dlaczego pobierasz WSZYSTKIE elementy a dopiero potem je "wyszukujesz" w duzej tablicy? Załóż klucz "index" na pole "idParent" w swojej bazie i wyszukuj tylko te rekordy, które potrzebujesz Po to pobieram wszystkie i przelatuję w pętli aby ograniczać ilośc zapytań do bazy (których przy założeniu że kategorie trzeciego poziomu już nie mają potomków) będzie 165. Ta sama wersja ale oparta na pobieranie kategorii z bazy za kazdym razem wykonuję mi sie prawie 1,5 sekundy więc to tez odpada. |
|
|
![]()
Post
#6
|
|
Grupa: Moderatorzy Postów: 8 989 Pomógł: 1550 Dołączył: 8.08.2008 Skąd: Słupsk/Gdańsk ![]() |
A stworzyłeś klucze tak jak mówiłem?
Pozostaje Ci cache jak nic innego nie chcesz robić. |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 89 Pomógł: 7 Dołączył: 19.05.2008 Ostrzeżenie: (0%) ![]() ![]() |
Można trochę udoskonalić kod, wywalić foreach czy wyciągnąć count przed pętle - to tak na pierwszy rzut oka. Może tutaj znajdziesz coś co pomoże.
|
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 215 Pomógł: 19 Dołączył: 24.12.2003 Skąd: Przemyśl Ostrzeżenie: (0%) ![]() ![]() |
A stworzyłeś klucze tak jak mówiłem? No pewnie ale tak jak napisałem za dużo zapytań by było. Można trochę udoskonalić kod, wywalić foreach czy wyciągnąć count przed pętle - to tak na pierwszy rzut oka. Może tutaj znajdziesz coś co pomoże. No a co mi da wywalenie pętli jak ja jej potrzebuję. Count jest odpalany raz na początku pętli a nie za każdą iteracją. Natomiast zastosowanie tylko jednego count-a i przypisanie go do właściwości klasy aby uniknąć ponownego odpalania w rekurencji nie poprawiło efektywności. Zerknę jeszcze na link który zapodałeś |
|
|
![]()
Post
#9
|
|
Grupa: Moderatorzy Postów: 8 989 Pomógł: 1550 Dołączył: 8.08.2008 Skąd: Słupsk/Gdańsk ![]() |
No to nie ma opcji. Przebudowa drzewa albo siedzisz dodatkowych pare godzin nad cache.
|
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 706 Pomógł: 108 Dołączył: 12.03.2010 Ostrzeżenie: (0%) ![]() ![]() |
Count jest odpalany raz na początku pętli a nie za każdą iteracją. Niestety mylisz się. Jak masz count( ) w środkowej części for to odpala się co iterację i tak musi być, bo przecież mógłbyś sobie dodawać/usuwać w pętli elementy tablicy i wtedy cache'owanie tej wartości byłoby bez sensu. |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 215 Pomógł: 19 Dołączył: 24.12.2003 Skąd: Przemyśl Ostrzeżenie: (0%) ![]() ![]() |
Niestety mylisz się. Jak masz count( ) w środkowej części for to odpala się co iterację i tak musi być, bo przecież mógłbyś sobie dodawać/usuwać w pętli elementy tablicy i wtedy cache'owanie tej wartości byłoby bez sensu. Czegoś chyba nie kumam mówisz o tej części ? Przecież tu mam odpalanie counta raz dla danej rekurencji. Przecież gdyby było co iterację to by było |
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 2 291 Pomógł: 156 Dołączył: 23.09.2007 Skąd: ITALY-MILAN Ostrzeżenie: (10%) ![]() ![]() |
@cron ma racje wywal tego count() nad petle, przypisz to co zwraca do jakiejs zmiennej i to ja przekazuj do petli.
|
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 215 Pomógł: 19 Dołączył: 24.12.2003 Skąd: Przemyśl Ostrzeżenie: (0%) ![]() ![]() |
@cron ma racje wywal tego count() nad petle, przypisz to co zwraca do jakiejs zmiennej i to ja przekazuj do petli. Napisałem wcześniej że nie widziałem praktycznie żadnej zmiany wydajności na plus gdy dałem wynik count-a do właściwości klasy
|
|
|
![]()
Post
#14
|
|
Grupa: Moderatorzy Postów: 6 072 Pomógł: 861 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza ![]() |
|
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 215 Pomógł: 19 Dołączył: 24.12.2003 Skąd: Przemyśl Ostrzeżenie: (0%) ![]() ![]() |
@jajcarzd1: Nie słuchaj ~crona ani ~marcio odnośnie tej pętli. Pierwotnie, czyli tak: miałeś dobrze. No do tego rozwiązania jestem przekonany że miałem dobrze, ale oczywiście w każdej rekurencji pętla leci od nowa więc tam jest ponownie odpalany count(), ale tak jak napisałem przerzucenie jego wyniku do właściwości obiektu praktycznie nic nie dało bo to zbyt mały zysk. |
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 89 Pomógł: 7 Dołączył: 19.05.2008 Ostrzeżenie: (0%) ![]() ![]() |
z wywaleniem foreach miałem na myśli zamianę na for/while ale wiele to nie da bo tam akurat masz mało iteracji.
|
|
|
![]()
Post
#17
|
|
Grupa: Zarejestrowani Postów: 706 Pomógł: 108 Dołączył: 12.03.2010 Ostrzeżenie: (0%) ![]() ![]() |
Aha, zawarłeś to jednak w pierwszej części for, no to ok - liczy raz. Nie wczytałem się dokładnie w kod, sorry (IMG:style_emoticons/default/smile.gif) Ale uważam, że takie upychanie na siłę kodu nie jest zbyt dobrym pomysłem. Wprawdzie masz argument, że tego counta liczysz tylko na chwilę, dla pętli, ale chyba lepiej jak widać od razu poszczególne części for.
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 17.09.2025 - 15:06 |