È più efficiente eseguire una query una volta per tutte le impostazioni o eseguire una query ogni volta che è necessaria un'impostazione?

1

Per il mio script del blog ho creato un gruppo di utenti e un sistema di autorizzazione. Ogni utente è assegnato a un gruppo di utenti e ho una lunga lista di impostazioni di autorizzazione. Entrambi sono memorizzati in un database MySQL.

Al momento eseguo circa 10 query di autorizzazione per ogni pagina, per varie funzioni di gestione dei contenuti. Accoppiato con un altro 20 o più query per l'uso generale del blog, il numero di query sta crescendo.

Sarebbe più efficiente eseguire una query all'inizio dello script per recuperare tutte le impostazioni dei permessi in un array, e poi fare in modo che tutte le funzioni confrontino i valori nell'array invece di controllare il database?

    
posta Jared 15.07.2011 - 10:58
fonte

2 risposte

7

Sì, 1 query è più efficiente di X.

Hai considerato di ridurre ulteriormente le query eseguendo questa operazione solo al momento dell'accesso e memorizzando le autorizzazioni nella sessione?

    
risposta data 15.07.2011 - 11:03
fonte
0

Building on what @Jonno said here: Is it more efficient to query once for all settings, or query whenever a setting is needed?

La Q originale va così:

For my blog script I have a usergroup and permission system set up. Each user is assigned to a usergroup and I have a long list of permission settings. Both are stored in a MySQL database.

At the moment I perform around 10 permission queries for each page, for various content management functions. Coupled with another 20 or so queries for general blog use, the number of queries is building up.

I'm wonder if it's the more efficient choice to perform 1 query at the start of the script to add all permission settings to an array, then have all functions compare values in the array instead of checking the database.

Opinions?

E i fatti e le domande?

  • Fatto: 1 query è meno di x query. (meno tempo di consumo, meno elaborazione, ecc.)
  • Fatto: senza profilazione , stai solo indovinando. Non programma per indovinare.
  • Domanda: hai controllato quanto è intenso farlo?

Posso rispondere a quest'ultima. È "No, non ho" e lo so perché se lo avessi, saresti venuto qui con "come faccio a rendere questa architettura più veloce". (Una cosa che i programmatori sembrano non gradire è "ma non l'hai provata prima!?!?!", Quindi tienilo a mente in futuro.)

Se lo fai come la maggior parte delle persone, stai effettivamente eseguendo la query attraverso un altro livello di roba, che richiede molto tempo (in tempo di CPU) per restituire effettivamente i risultati e vuoi che impieghi meno tempo . Potresti provare diverse cose, ad esempio la codifica manuale della query, il che sarebbe di aiuto, ma ridurrebbe la disponibilità dei livelli intermedi che stai già utilizzando.

Ma ciò che è stato suggerito nella risposta di Jonno è stato il modo in cui ti suggerirei di farlo. Crea un'API per le autorizzazioni. Quando si aggiorna un'autorizzazione, lo si fa attraverso questa API e l'API controlla entrambe le sessioni correnti per quell'utente, aggiornandosi quando viene trovato e quindi aggiorna il database. Tiene anche traccia di tutte le impostazioni così modificate e annulla tutto se si verifica un errore. Stato transazione Yay. Certo, il modo ingenuo cerca di aggiornare e ignora qualsiasi errore.

Quindi lo implementeremo in pseudocode, ok?

class sessionByUser{
  User user

  UpdateValue(key,value){
    foreach(session in Sessions){
      if (session.user == user)
        session.key = value
    }
    db.updateUserKey(key,value) //what you were doing before
  }
}

E puoi vedere quanto immediatamente abbiamo bisogno di implementare il resto delle operazioni crud, ma questo ci fornisce le basi per un aggiornamento in tempo reale dei valori delle sessioni utente.

Come ho detto, questo è totalmente pseudocodice, ma è così che si fa, se non si torna al database ogni volta. FWIW : il database utente Microsoft ASP.NET torna ogni volta al database per verificare se qualcosa è stato aggiornato. Non ha alcun carico notevole sul mio sistema.

Inoltre, questa configurazione funziona anche per altri valori globali. Supponiamo che tu voglia avere un archivio di oggetti globale per tenere traccia di cose come le chiavi API per altri servizi, potresti usare questo stesso concetto di avere un singleton globale con metodi di accesso come questo.

    
risposta data 20.07.2011 - 20:56
fonte

Leggi altre domande sui tag