![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 30 Pomógł: 0 Dołączył: 12.03.2005 Ostrzeżenie: (0%) ![]() ![]() |
Witam,
Mam problem z pewnym zadaniem. Mam jedno rozwiązanie ale jakoś mnie to nie zadowala. Chodzi o takie zapytanie:
w tabeli 'users' jest kilka tysięcy wpisów a w voting jest tez kilka tysiecy (ale bedzie o wiele wiecej - bo tu zapisywane sa dane zwiazane z pewnym glosowaniem na stronie i kazdy użytkownik glosuje po setki razy). Takie zapytanie niestety jest tak pamięciożerne że siada mi cała strona. Zmieniłem to na takie coś że najpierw zbieram dane do tabeli z tego zapytania:
i podstawiam do zapytania gotową listę użytkowników:
ale wyczytałem na róznych forach dyskusyjnych że NOT IN generalnie nie jest szybkie i ze jak $tabela_uzytkownikow bedzie zawierac tysiace wartosci to moze powodować to duże opóźnienia... Jakiś pomysł na inne rozwiazanie? Generalnie wyglada to tak że uzytkownik A dostaje losowego użytkownika do glosowania (powidzmy ze glosuje na to czy mu sie podoba czy nie). Ma dwie odpowiedzi. TAK lub NIE. Po zaglosowaniu zapisywane jest do bazy do tabeli VOTING voter_id (czyli ten uzytkownik A), user_id (czyli ta osoba na która glosowano) no i sama odpowiedz. Po zaglosowaniu trzeba wylosowac nastepnego uzytkownika do głosowania, ale oczywiscie nie moze to być osoba na którą juz glosowalismy Tabele mamy takie: USERS: user_id image VOTING voter_id user_id Z gory dzieki za pomysły! |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 226 Pomógł: 61 Dołączył: 20.08.2010 Ostrzeżenie: (0%) ![]() ![]() |
@geogis Generalnie zapytania z IN( podzapytanie ) lub NOT IN( podzapytanie ) można optymalizować stosując złączenia tabel. W twoim przypadku będzie to zapytanie, które:
Pobiera wszystko z tabeli users do której dołączona jest tabela voting w taki sposób, że jeśli user15 głosował na tego użytkownika, to dołączone są dane głosowania, a w przeciwnym wypadku NULLe i wybieramy wiersze, które mają NULLe w danych z tabeli głosowania
Jeśli masz dobrze pozakładane indeksy, to EXPLAIN powinien wyświetlić miłe dla oka informacje. ALE tak samo jak inni uważam, że na wydajności tracisz głównie przez ORDER BY RAND(). Są sposoby na jego optymalizację, poszukaj w necie. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 13.10.2025 - 06:45 |