Question

Supposons que j'ai le modèle Foo dans GAE et cette requête:

query = Foo.all (). order ('- clé ')

Je veux obtenir le nième enregistrement. Quel est le moyen le plus efficace d'y parvenir?

La solution sera-t-elle interrompue si la propriété ordering n'est pas unique, comme celle ci-dessous:

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

modifier: n > 1000

modifier 2: je souhaite développer un mécanisme de pagination conviviale qui présente les pages disponibles (telles que la page 1, la page 2, ..., la page 185) et qui nécessite le symbole "? page = x". dans la chaîne de requête, au lieu d'un "? bookmark = XXX". Lorsque page = x, la requête doit extraire les enregistrements commençant par le premier enregistrement de cette page.

Était-ce utile?

La solution

Il n’existe aucun moyen efficace de le faire - dans aucun SGBD. Dans tous les cas, vous devez au moins lire séquentiellement dans les enregistrements d'index jusqu'à trouver le nième, puis rechercher l'enregistrement de données correspondant. C’est plus ou moins ce que fetch (count, offset) fait dans GAE, avec la limitation supplémentaire de 1000 enregistrements.

Une meilleure approche consiste à conserver un "signet", composé de la valeur du champ que vous commandez pour la dernière entité extraite et de la clé de l'entité. Ensuite, lorsque vous souhaitez continuer là où vous l'avez laissé, vous pouvez ajouter la valeur du champ en tant que limite inférieure d'une requête d'inégalité et ignorer les enregistrements jusqu'à ce que vous obteniez une correspondance ou une dépassement avec la dernière que vous avez vue.

Si vous souhaitez fournir aux utilisateurs des décalages de page "conviviaux", vous pouvez utiliser Memcache pour stocker une association entre un décalage de début et un tuple de marque-page (propriété_ordre, clé). Lorsque vous générez une page, insérez ou mettez à jour le signet de l'entité suivant le dernier. Lorsque vous récupérez une page, utilisez le signet, s'il existe, ou générez-le difficilement, en effectuant des requêtes avec des décalages - éventuellement plusieurs requêtes si le décalage est suffisamment élevé.

Autres conseils

La documentation de la classe Query est disponible à l'adresse suivante: http://code.google.com/appengine/docs/ python / datastore / queryclass.html # Requête

La classe de requête fournit une extraction qui prend une limite et un décalage dans votre cas 1 et n

La durée d'exécution de l'extraction croît linéairement avec le décalage + la limite

donc, le seul moyen d'optimiser votre cas serait de vous assurer que les enregistrements souhaités accéder le plus souvent sont plus proches du début du tableau.

Vous pouvez utiliser query.filter ('key =', n) query.get ()

qui renverrait le premier match avec une clé de n

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top