
[sql:1:b8f8130be6]CREATE TABLE `scan_userfriends` (
`userID` bigint(20) unsigned NOT NULL default '0',
`friendID` bigint(20) unsigned NOT NULL default '0'
) TYPE=MyISAM;[/sql:1:b8f8130be6]
natomiast problem wyciągania zapytań został rozwiązany następująco w 3 zapytaniach (tutaj dla uzytkownika nr 1):
Zapytanie nr1
[sql:1:b8f8130be6]SELECT friendID FROM scan_userFriends WHERE userID = 1[/sql:1:b8f8130be6]
po wyciagnieciu ID zapisujemy je do tablicy w php i następnie złączamy do postaci "1,45,85,296,904,10535,..." i wykonujemy kolejne zapytanie
[sql:1:b8f8130be6]SELECT friendID FROM scan_userFriends WHERE userID IN(1,45,85,296,904,10535,...) AND friendID <> 1[/sql:1:b8f8130be6]
Tera zapisujemy do innej tablicy wyniki tego zapytania (np. "3,1056,4352,9024,10466,14935,66043,...")
i wykonujemy zapytanie
[sql:1:b8f8130be6]SELECT friendID FROM scan_userFriends WHERE userID IN (3,1056,4352,9024,10466,14935,66043,...) AND userID NOT IN(1,45,85,296,904,10535,...) AND friendID <> 1[/sql:1:b8f8130be6]
czyli pobieramy ID, których rodzicem są ID z drugiego zapytania i ale nie z pierwszego zapytania.
Działa to bardzo sprawnie nawet na tabelach o bardzo duzej ilości rekordów, ale mimo to pomyślałem o keszowaniu wyników i wymyśliłem taką strukturę tabeli:
[sql:1:b8f8130be6]CREATE TABLE `friends_cached` (
`userid` int(11) NOT NULL default '0',
`friends` text NOT NULL,
`friends_count` int(11) NOT NULL default '0',
`cached` varchar(14) NOT NULL default '',
PRIMARY KEY (`userid`)
) TYPE=MyISAM;[/sql:1:b8f8130be6]
gdzie userid to numer ID użytkownika, friends to numery ID userów rozdzielone przecinkami, friends_count to liczba przyjaciół (żeby za każdym razem nie pobierać z tabeli z powiązaniami), a cached to pole zawierajace czas ostatniego uaktualnienia wyników.
Kiedy będzie tabela uaktualniana:
a) jeżeli od ostatniego keszowania minęło więcej niz 0,5 - 2 h (nie wiem ....)

c) przy usunięciu użytkownika
d) przy jakiejkolwiek innej zmianie, która wpływa na ilość znajomych
Ponieważ uaktualnianie może mimo wszystko troche zająć to wymyśliłem takie rozwiązanie:
wyświetlamy użytkownikowi strone, że za chwile zostanie przeniesiony na inną, potem przekierowyjemy go przez meta-refresh, a skrypt dalej sie wykonuje i wywołuje funkcję zapisującą dane. Jednocześnie z linkiem przekazujemy czas kiedy nastapiło keszowanie i na następnej stronie sprawdzamy czy w bazie pole "cached" ma taką wartość. Jeżeli tak to OK, jeżeli nie to wyświetlamy, że "prosze czekać" czy cos takiego...
Co Wy na to?? Jake macie sugestie co do optymalizacji pierwszych 3 zapytań i w stosunku do keszowania?