Pulitura dei Parcheggiati postato il 29/01/2008 17:20:29 nel forum programmazione, gdrcd, open source, hosting
Ciao a tutti.
Scrivo qui per sentire pareri e idee nuove da parte di chi sa usare gdrcd o chi sfrutta altri codici proprietari.
Il motivo è che vorrei diminuire i costi (in termini di processore) durante l'operazione di assegnazione stato "Assente" ai personaggi parcheggiati da xx minuti (non che il grande blu sia lento, al contrario, ma vorrei ottimizzare quest'ultima operazione prima di dedicarmi ad altro).
Questa discussione penso potrà essere utile anche ad altri in quanto proporrò le mie soluzioni.
Le idee che ho in mente sono due.
Prima soluzione
Avere un'unica tabella con elencati i personaggi e i loro dati. In questa tabella è presente un campo booleano {0,1} "presente" e un campo "evento" di tipo datetime che salva l'ultima operazione svolta dall'utente.
In una pagina tipo quella di login inserire una query (una volta ogni yy minuti) di tipo:
update utenti set online=0 where evento<(now()-interval xx minute)
Seconda soluzione
Avere una tabella con elencati i personaggi e i loro dati.
Avere una tabella "utenti_online". In questa tabella è presente un campo che identifica il personaggio e un campo "evento" di tipo datetime che salva l'ultima operazione svolta dall'utente.
Ad ogni login inserire nella tabella "utenti_online" l'utente.
In una pagina tipo quella di login inserire una query (una volta ogni yy minuti) di tipo:
delete from utenti_online where evento<(now()-interval xx minute)
Problemi:
Prima soluzione
Ogni yy minuti (che possono essere 30-60 mediamente) viene generata una query pesante in quanto il database deve scorrere l'intera tabella utenti, fare un'operazione sulle date, reimpostare il flag "presente" a tutti i risultati che soddisfano evento<(now()-interval xx minute)
Seconda soluzione
La query di cancellazione utenti online è leggera perchè pesca da una tabella poco estesa.
Il problema ricade però nella pagina di ricerca:
Quando si cercano gli utenti online bisogna fare una inner join dalla tabella "utenti_online" alla tabella "utenti" per estrarre i dati utili da stampare a pagina.
In gdrcd mi sembra che si modifica la soluzione numero due:
Dentro la tabella "utenti_online" ci si copia qualche valore tipo carica e araldica per evitare la inner join.
E' una soluzione che va a compromettere l'integrità del database perchè crea spontaneamente delle ridondanze.
Inoltre se io decidessi di voler stampare a video anche il parametro zzz durante la ricerca dovrei:
1) inserire un campo zzz nella tabella "utenti_online"
2) modificare ciò che voglio copiare in "utenti online" durante il login
3) modificare la pagina di ricerca
Non ci sono problemi in nessuna delle due soluzione finchè la tabella la tabella "utenti" contiene qualche centinaia di record.
Il problema subentra con molti utenti.
Qualcuno saprebbe confermarmi come funziona su gdrcd? Se funziona così in tutti i gdrcd?
Come qualche codice chiuso ha trovato soluzione?
Vi ringrazio e spero che le mie idee possano essere state utili a molti.
👋
Pagine → 1
29/01/2008 18:05:04
Inanzi tutto ti ringrazio dell' invito a partecipare a questa discussione.
RomaImperiale.com utilizza delle APP e non il DB per gli online e quando salva dati nelle APP non crea una ridondanza che compromette il Database ma solo una ridondanza virtuale e temporanea.
Ad ogni modo se tu vuoi salvare l'ultima operazione in formato time e già hai implementato il sistema, nel momento in cui stampa la pagina degli online, nella cui tabella hai aggiunto il campo Data dell' ultima azione non potresti richiamare tutte le date e far eseguire un semplice IF di in fase di scrittura funzionante con una funzione che differisca le date?
Forse questa soluzione però è pesantina la più leggera forse è quella di lanciare la qry che pesca gli attivi, li stampa e metti infondo gli inattivi qry in cui non si rifà i conti ma stampa a video i rimanenti.
Idee buttate li. Comunque secondo me risparmi sicuramente più processore non facendo fare alcun Join di quelle dimensioni, questo è poco ma sicuro.
29/01/2008 18:15:38 e modificato da shanks1 il 29/01/2008 18:16:29
La prima soluzione di cui parli è sicuramente molto pesante perchè la query andremme a prelevare tutti gli utenti (e sono tanti).
Non ho capito bene la seconda soluzione... sarebbe una query che comunque restituisce l'intera tabella utenti!?
Praticamente roma imperiale salva in ram tutti i dati degli utenti da presentare al momento della ricerca online, sbaglio?
Per ora non faccio join di quel tipo, ma sto valutando se mi possono convenire alla soluzione numero uno.
29/01/2008 18:21:04
Potrebbe venirti in aiuto (se usi Mysql 5) La creazione di una View.
29/01/2008 19:03:54
@mook:
ti ringrazio: mi hai fatto venire in mente che esistono view e trigger.
Le view non mi sono utili, ma con una piccolissima ridondanza di una variabile booleana si riesce a ottenere prestazioni OTTIME con l'utilizzo di un paio di trigger :D
Senza di te non ci sarei mai arrivato.
29/01/2008 19:11:50
Tutto è bene quel che finisce bene u.u
29/01/2008 19:18:46
Devo ammettere che i trigger sono utilissimi, mi sa che nei prossimi giorni il grande blu diventerà ancora più veloce :)
29/01/2008 19:27:44
Volevo proporti dei trigger ma non sapevo che versione di Mysql usavi, nel senso che dalla 5.0 in poi i trigger si possono pure usare ma prima erano ancora "imperfette".
30/01/2008 00:26:37
Però ogni volta che un utente chiama la pagina di ricerca vengono eseguiti controlli in più!
Mi sembra più pesante dato che deve comuque scorrere tutta la tabella degli utenti.
Preferisco una query leggera de eseguire 1-2 volte l'ora.
Pagine → 1
Rispondi alla Discussione Aggiungi ai Preferiti Inoltra Discussione Forum Programmazione, GDRCD, Open Source, Hosting Elenco Forum
Planethos GdR: Una nuova profezia
Enlisted → Guida la tua squadra di soldati in combattimenti su larga scala, con fanteria, veicoli corazzati e aerei della IIa Guerra Mondiale!
Metin2: Informazioni sul server migliorate
Age of Crystals: Rallentamenti estivi
dbzgdr ha risposto alla discussione: Dragon Ball Z Gdr
Titan Revenge: Calendario eventi fino a fine mese online!
Piume Nere → Inquisizione, Intrigo e Soprannaturale: quali torbidi e oscuri segreti si celano tra le nebbie di Laddington? Iscriviti per scoprirlo!
Enlisted: Modifiche al sistema di aggiornamento
pyro72 ha aperto un annuncio di ricerca: World Without Heroes ricerca Giocatore
Storie di Agarthi → Un Varco si apre davanti a te, un mondo tra i mondi è a portata di mano. Lasciati alle spalle le certezze, diventa quello che hai sempre cercato.
World Without Heroes: News GDR: Pubblicazione e Nuovo Inizio
I dati del generatore di rank sono stati aggiornati!
Il gestore di Nexi Generation ha risposto alla recensione di deanna
CRSED: F.O.A.D. → Brutale sparatutto MMO in cui vince l'ultimo giocatore che resta in vita nell'arena! Ogni giocatore sarà accompagnato da armi realistiche e magie!
Gianluca e GDR-online - Il gestore di GDR-online.com viene intervistato per la seconda volta e parla delle ultime novità del portale
Epic Quests - Epic quests: la popolarità dei temi fantasy nei giochi online
GeoWar - Scopriamo assieme GeoWar: un Browsergame Strategico Innovativo e made in Italy!
Arcana Domine - LARP Isola dei Dannati: il GDR ad altissima risoluzione!
F.a.q. del Portale - Hai dei dubbi sull'utilizzo del portale? Dai un occhiata alle frequently asked questions!
Gdr e Copyright - Vuoi creare un gdr? Conosci le regole sul copyright e il diritto d'autore? Scoprile con questo articolo!