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
venus dormiens ha aperto un annuncio di ricerca: Origo Haeredis - Harry Potter Gdr ricerca Giocatore
Metin2: Server Boost Yohara – Dettagli e FAQ
Game of Thrones → Pronto a diventare il Signore dei Sette Regni? Guida la tua grande casata in epiche battaglie PvP ed esplora il mondo di Westeros!
Sea of Conquest: Ci dai una mano ai #PocketGamer Awards 2024?
goldaries ha recensito Games of Thrones Winter is Coming
spike92 ha recensito Il Grande Blu
World of Warship: Aggiornamento 13.11: anteprima
DarkOrbit → Galassie remote e pericoli in agguato ti attendono. Vinci battaglie avvincenti in DarkOrbit: diventa un cosmonauta temerario e combatti!
gdr-online.com ha risposto alla discussione: Parere su BrowserGame
W40K Dathyar: Specializzazioni
NosTale: Ora nel NosMall: dolcissimi mini-pet
DarkOrbit: Aggiorna la scatola dell'Apocalisse!
NosTale → Con l’aiuto della spada e della bacchetta magica risolverai abilmente intricate missioni e domerai coraggiosamente mostri selvaggi!
I dati del generatore di rank sono stati aggiornati!
aik ha aperto una nuova discussione: Parere su BrowserGame
eXtremelot: La Bussola dei Cartografi di Lot
Dallas Black Gold: [Trama] JFK Memorial
Enlisted → Guida la tua squadra di soldati in combattimenti su larga scala, con fanteria, veicoli corazzati e aerei della IIa Guerra Mondiale!
Giochi di Zombie - Immergiti in mondi devastati da orde di zombie e fai di tutto per sopravvivere!
Trends di Ricerca - Scopriamo assieme l'evoluzione nel tempo dei volumi di ricerche sui motori di ricerca delle chiavi di nostro interesse!
Metin2 - Sfida i tuoi rivali a battersi con te e dimostra la tua superiorità in questo mondo fantasy!
Statistiche Tecniche 2019 - Gdr-online.com pubblica i dati tecnici dei suoi visitatori per l'anno 2019. Spulcia i dati disponibili!
Giochi Vampiri - Lista completa dei giochi di ruolo online sui vampiri
Altervista e CloudFlare - Altervista e HTTPS: Problemi e possibili soluzioni analizzate nel dettaglio per passare i vostri giochi all'https!