konto usunięte

Temat: Wydajność, a tablice

Pracuję przy serwisie, a dokładnie module forum dyskusyjnego, które posiada również system przywilejów użytkownika (przeglądanie, odpowiadanie itp.). Przy każdym odświeżeniu forum, podstrony forum, poddziału itp. następuje sprawdzenie w bazie, czy forum jest prywatne, i jeśli tak, to czy dany zalogowany użytkownik ma do niego prawa dostępu, przeglądania/odpowiadania itp.

Wywołania występują bardzo często (ok. 100-150 aktywnych użytkowników cały czas). Jaka jest najlepsza droga do zoptymalizowania takiego rozwiązania? Czy wybór SELECT'em, forum_id = blabla AND private = 1 AND id_serwisu = blabla, i sprawdzanie ilości wierszy, czy być może fetch całej tabeli (id, forum_id, private, id_serwisu) do tablicy w pamięci, i następnie szybkie pojechanie po tej całej tablicy w poszukiwaniu zlepionej linijki z takimi parametrami?

Wiem, że silnik bazy bardziej męczy się przy wybiorach SELECT/WHERE, bo musi pojechać po wszystkich wierszach. W przypadku tablicy jest to samo, ale jest ona tworzona tylko raz przy odświeżeniu forum, a np. sprawdzanie ilości wierszy musiałoby się odbywać tyle razy, ile jest podforów. Poza tym, przy sprawdzaniu tablicowym pętla kończy działanie po napotkaniu szukanej linijki - wiadomo, że istnieje.

Co lepiej zastosować? Metoda z liczeniem wierszy i WHERE'ami obciążyła serwer katastrofalnie, tablicowa trochę lepiej, ale serwis wyraźnie zwolnił.

Pozdrawiam serdecznie.
Grzegorz G.

Grzegorz G. ASE / Systems
Architect, Syniverse

Temat: Wydajność, a tablice

[author]Jakub

konto usunięte

Temat: Wydajność, a tablice

zrób tabele:

user_to_forum(user_id, forum_id, service_id)
+ indeks na wszystkie wymienione pola

do tabeli wstawiaj użytkowników, którzy mają dostęp do prywatnego forum. Wyszukiwanie będzie błyskawiczne. Dla ułatwienia możesz dodawać użytkownika specjalnego (np. user_id = 1), który będzie oznaczał "wszyscy". Dzięki temu masz jedno zapytanie z jednym lub maks. dwoma rekordami wynikowymi.

Drugi etap jest potrzebny jeśli takie zapytanie wykonujesz więcej niż raz na generację strony - wtedy zapamiętaj wynik zapytania w jakiejś zmiennej, przykład:

$user_to_forum_cache[$forum_id."_".$service_id."_".$user_id] = $has_access;

Następna dyskusja:

Czy da sie zrobic tablice a...




Wyślij zaproszenie do