Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Forum - mechanizm oznaczania tematow jako przeczytane, jw
ElemenT
post
Post #1





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 29.03.2003
Skąd: Warszawa

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


Witam,

Jestem na etapie konczenia pisania forum jednak zostalo mi pare dupereli do dopisania m.in. oznaczanie czy ktos przeczytal dany temat czy nie.

Wymyslilem taki algorytm :

1. sprawdzam date ostatniego logowania lub wejscia (w zaleznosci czy jestem zalogowany czy nie)
2. wstepnie zaznaczam tematy jako nieprzeczytane od tamtego czasu
3. tematy obejrzane zaznaczam jako przeczytane (np zapisujac do cookiesa co widzialem, moze ew z jakas data)

Ma ktos jakies propozycje jak taki algorytm rozwinac ?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Kicok
post
Post #2





Grupa: Zarejestrowani
Postów: 1 033
Pomógł: 125
Dołączył: 17.09.2005
Skąd: Żywiec

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


Cytat
1. obecnie mam kolo 17 tys kont


Zauważ, że rekordy do tej tabeli dodawane będą dopiero po zalogowaniu się użytkownika, nie po napisaniu postu. Więc jeśli z tych 17 tys. kont aktywnych użytkowników jest 7 tyś, to tylko oni będą wpływali na zapełnienie tabeli.


Cytat
i przy takich liczbach taka tablica moze byc duza i moze spowalniac forum a zalezy mi by moje nowe
forum smigalo jak smiga obecnie


Dodanie jednego miliona rekordów do tabeli:
  1. <?php
  2.  
  3. error_reporting( E_ALL | E_STRICT );
  4.  
  5.  
  6. $conn_id = mysql_connect( 'localhost', 'root', 'root' );
  7. mysql_select_db( 'test', $conn_id );
  8.  
  9.  
  10. for( $i=0; $i<1000000; $i++ )
  11. {
  12. $user_id = mt_rand( 1, 1000 );
  13. $post_id = mt_rand( 1, 50000 );
  14.  
  15. mysql_unbuffered_query( "INSERT INTO unread (user_id, post_id) VALUES ({$user_id}, {$post_id})", $conn_id );
  16. }
  17.  
  18. mysql_close( $conn_id );
  19.  
  20. ?>



Proste testy wydajnościowe:
  1. <?php
  2.  
  3. error_reporting( E_ALL | E_STRICT );
  4.  
  5.  
  6. $conn_id = mysql_connect( 'localhost', 'root', 'root' );
  7. mysql_select_db( 'test', $conn_id );
  8.  
  9.  
  10. $user_id = mt_rand( 1, 1000 );
  11.  
  12. $start = microtime( true );
  13. $result = mysql_query( "SELECT post_id FROM unread WHERE user_id = {$user_id}", $conn_id );
  14. $stop = microtime( true );
  15.  
  16.  
  17. $count = mysql_num_rows( $result );
  18. $time = bcsub( $stop, $start, 8 );
  19.  
  20.  
  21. echo "User ID: {$user_id}<br />";
  22. echo "Wykonano w <b>{$time}</b>s.<br />";
  23. echo "Ilość wyników: {$count}";
  24.  
  25.  
  26. mysql_close( $conn_id );
  27.  
  28. ?>



Na moim komputerze wyniki mieściły się w granicach 0.003 - 0.005s. Jeśli dla ciebie to zbyt dużo, to faktycznie, powinieneś poszukać jakiegoś mniej dokładnego, ale szybszego rozwiązania.
Oczywiście jest to test dla prostego zapytania SELECT. W boju trzeba będzie jednak używać czegoś bardziej skomplikowanego, typu:
  1. SELECT u.post_id
  2. FROM unread AS u
  3. JOIN posts AS p ON ( u.post_id = p.post_id )
  4. WHERE ( p.topic_id = $topic_id ) AND ( u.user_id = $user_id )

jednak nie sądzę, żeby w tym przypadku czas wykonania zapytania podskoczył drastycznie. Wszystko zależy od poprawnego założenia indeksów na kolumny (więcej: google -> MySQL optymalizacja)
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 6.10.2025 - 02:23