5

Dal blog di Appengine:In che modo appengine implementa la query su un elenco in modo efficiente?

Pianificazione avanzata delle query - Stiamo eliminando la necessità di utilizzare gli indici e di ridurre i requisiti degli indici personalizzati per molte query. L'SDK suggerirà indici migliori in diversi casi e un prossimo articolo descriverà quali ulteriori ottimizzazioni sono possibili.

Come prova, ho un'entità in AppEngine che ha un ListProperty

class Entity(db.Model): 
    tags = db.StringListProperty() 

devo 500.000 soggetti, la metà di loro hanno tag = [ '1'], e l'altra metà hanno tag = [ '2']

mia domanda è

SELECT FROM Entity WHERE tags='1' and tags='2' 

Esso non ha prodotto risultati molto velocemente. Che piano sta usando per raggiungere questo obiettivo? Come viene indicizzato l'elenco per raggiungere questo obiettivo? Ai vecchi tempi sarebbe stato necessario un indice esplosivo.

+0

IIRC è stato trattato in uno dei discorsi tecnici: non ha mai richiesto un indice di esplosione, solo una StringListProperty – bdonlan

+1

Nessuna delle modifiche avanzate alla pianificazione delle query influirà su questa query. Come hai inserito le entità? Se tutti quelli con tag = 2 hanno ID superiori a quelli con tag = 1 (o viceversa), questa query è banale da soddisfare. –

+0

Penso che la query fosse: SELECT FROM Entity WHERE tags = '1' e tags = '2' ORDER BY date – Jaap

risposta

2

L'algoritmo utilizzato internamente ('unione unione') è stato descritto nel talk tecnologico Google I/O 2009 Building Scalable, Complex Apps on App Engine. Questa funzionalità è stata disponibile anche dal lancio di GAE; gli "indici di esplosione" si verificano solo se si crea un indice composto di più StringListProperties.

Vale la pena notare che questa funzionalità è in realtà un po 'più generica di quanto tu possa realizzare: qualsiasi combinazione di più filtri di uguaglianza su qualsiasi combinazione arbitraria di proprietà può essere soddisfatta senza alcun indice composto, purché siano tutti filtri di uguaglianza e tu non hai un ordinamento Non tutti devono appartenere a una proprietà StringList e possono essere suddivisi tra più proprietà StringList.

Problemi correlati