Domanda

Supponi di avere il modello Foo in GAE e questa query:

query = Foo.all (). order ('- chiave ')

Voglio ottenere l'ennesimo record. Qual è il modo più efficiente per raggiungere questo obiettivo?

La soluzione si interromperà se la proprietà di ordinazione non è univoca, come quella seguente:

query = Foo.all (). order ('- color ')

modifica: n > 1000

modifica 2: desidero sviluppare un meccanismo di paging amichevole che mostri le pagine disponibili (come Pagina 1, Pagina 2, ... Pagina 185) e richieda una pagina "quot = x"; nella stringa di query, anziché un "? bookmark = XXX " ;. Quando page = x, la query è recuperare i record a partire dal primo record di quella pagina.

È stato utile?

Soluzione

Non esiste un modo efficace per farlo - in nessun DBMS. In ogni caso, devi almeno leggere sequenzialmente i record dell'indice fino a trovare l'ennesimo, quindi cercare il record di dati corrispondente. Questo è più o meno ciò che fa il recupero (conteggio, offset) in GAE, con l'ulteriore limitazione di 1000 record.

Un approccio migliore a questo è quello di mantenere un 'segnalibro', costituito dal valore del campo su cui stai ordinando per l'ultima entità che hai recuperato e dalla chiave dell'entità. Quindi, quando si desidera continuare da dove si era interrotto, è possibile aggiungere il valore del campo come limite inferiore di una query di disuguaglianza e saltare i record fino a quando non si corrisponde o supera l'ultimo visualizzato.

Se si desidera fornire offset di pagina "amichevoli" agli utenti, è possibile utilizzare memcache per memorizzare un'associazione tra un offset iniziale e una tupla segnalibro (order_property, key). Quando si genera una pagina, inserire o aggiornare il segnalibro per l'entità successiva all'ultima. Quando recuperi una pagina, usa il segnalibro se esiste, o generalo nel modo più difficile, eseguendo query con offset - potenzialmente più query se l'offset è abbastanza alto.

Altri suggerimenti

La documentazione per la classe Query è disponibile all'indirizzo: http://code.google.com/appengine/docs/ python / datastore / queryclass.html # query

La classe di query fornisce il recupero di streghe richiede un limite e un offset nel tuo caso 1 e n

Il tempo di esecuzione del recupero aumenta linearmente con l'offset + il limite

quindi l'unico modo per ottimizzare nel tuo caso sarebbe quello di assicurarti che i record desiderati per accedere più spesso sono più vicini all'inizio dell'array.

Potresti usare query.filter ('key =', n) query.get ()

che restituirebbe la prima corrispondenza con una chiave di n

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top