Se sim, qual?
Como nós sabemos?
Eu tenho 3 índices em uma consulta. Na verdade, apenas os 2 primeiros devem ser úteis
{
"v": NumberInt(1),
"key": {
"LongitudeLatitude": "2d",
"Prominent"▼: NumberInt(-1),
"indexContents": NumberInt(1)
},
"ns": "database.tablebusiness",
"name": "LongLat_Prominent_indexContents",
"dropDups": false,
"background": false
}
{
"v": NumberInt(1),
"key": {
"LongitudeLatitude": "2d",
"Prominent": NumberInt(-1)
},
"ns": "database.tablebusiness",
"name": "LongLat_Prominent",
"dropDups": false,
"background": false
}
Este não é necessário:
{
"v": NumberInt(1),
"key": {
"indexContents": NumberInt(1)
},
"ns": "database.tablebusiness",
"name": "indexContents",
"dropDups": false,
"background": false
}
Agora eu faço esta consulta
(a consulta é do PhP, então vou apenas colar o que vejo no mongodb log e no mongovue
database.tablebusiness query: { LongitudeLatitude: { $nearSphere: [ 106.772835, -6.186753 ], $maxDistance: 0.04498373205078301 }, Prominent: { $gte: 15 }, indexContents: { $all: [ /^aru/, /^op/ ] } } ntoreturn:20 ntoskip:80 nscanned:100 nreturned:20 reslen:1147 1927ms
Agora, copiar { LongitudeLatitude: { $nearSphere: [ 106.772835, -6.186753 ], $maxDistance: 0.04498373205078301 }, Prominent: { $gte: 15 }, indexContents: { $all: [ /^aru/, /^op/ ] } }
para o comando mongovue find me dá o comando real do banco de dados
db.tablebusiness.find({ "LongitudeLatitude" : { "$nearSphere" : [106.772835, -6.186753], "$maxDistance" : 0.044983732050783008 }, "Prominent" : { "$gte" : 15 }, "indexContents" : { "$all" : [/^aru/, /^op/] } }).limit(50);
O que é bom o suficiente (exceto que o limite muda um pouco). Fazendo explicar em mongo.exe eu tenho
db.tablebusiness.find({ "LongitudeLatitude" : { "$nearSphere" : [106.772835, -6.186753], "$maxDistance" : 0.044983732050783008 }, "Prominent" : { "$gte" : 15 }, "indexContents" : { "$all" : [/^aru/, /^op/] } }).limit(50).explain();
{
"cursor" : "GeoSearchCursor",
"nscanned" : 50,
"nscannedObjects" : 50,
"n" : 50,
"millis" : 3291,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
}
}
Agora, com base nisso, qual índice é usado? O mongodb usa algum índice? Quaisquer dicas sobre como melhorar esta consulta também serão apreciadas.
A razão pela qual você não pode dizer qual deles está sendo usado é por causa de um bug em que a explicação não inclui o nome do índice que está sendo usado para consultas de índice geográfico:
https://jira.mongodb.org/browse/SERVER-4213
O que sabemos é que deve ser um dos dois primeiros que você listou, que tem um elemento 2d primeiro. Não pode ser o
"indexContents": NumberInt(1)
índice. Você pode usar .hint() para especificar o índice a ser usado e comparar os resultados do índice em cada caso. Eu esperaria que o primeiro tivesse um desempenho melhor em geral (mas maior), pois contém todos os elementos que você está consultando:"LongitudeLatitude": "2d", "Prominent"▼: NumberInt(-1), "indexContents": NumberInt(1)
No entanto, isso dependerá dos próprios dados reais. Eu testaria um conjunto representativo de consultas e removeria o mais lento dos dois índices para evitar confusão.