Indexação de mangusto no código de produção


124

De acordo com a documentação do Mongoose para MongooseJSe MongoDB/ Node.js:

Quando o aplicativo é iniciado, o Mongoose chama automaticamente ensureIndexpara cada índice definido no seu esquema. Embora seja bom para o desenvolvimento, recomenda-se que esse comportamento seja desabilitado na produção, pois a criação do índice pode causar um impacto significativo no desempenho. Desative o comportamento definindo a autoIndexopção do seu esquema como false.

Isso parece instruir a remoção da indexação automática do mangusto antes da implantação para otimizar o Mongoose de instruir o Mongo a percorrer todos os índices na inicialização do aplicativo, o que parece fazer sentido.

Qual é a maneira correta de lidar com a indexação no código de produção? Talvez um script externo deva gerar índices? Ou talvez ensureIndexseja desnecessário se um único aplicativo for o único leitor / gravador de uma coleção, porque continuará um índice toda vez que ocorrer uma gravação no banco de dados?

Editar: Para complementar, o MongoDB fornece uma boa documentação sobre como fazer a indexação, mas não o porquê ou quando as diretivas de indexação explícitas devem ser feitas. Parece-me que os índices devem ser mantidos atualizados pelos aplicativos do gravador automaticamente nas coleções com os índices existentes, e isso ensureIndexé realmente algo único (feito quando um novo índice está sendo aplicado); nesse caso, o Mongoose autoIndexdeve ser um no-op em uma reinicialização normal do servidor.

Respostas:


134

Eu nunca entendi por que a documentação do Mongoose recomenda tão amplamente a desativação autoIndexna produção. Depois que o índice for adicionado, as ensureIndexchamadas subseqüentes simplesmente verão que o índice já existe e retornam. Portanto, ele só afeta o desempenho quando você cria o índice pela primeira vez e, nesse momento, as coleções geralmente estão vazias; portanto, a criação de um índice seria rápida de qualquer maneira.

Minha sugestão é deixar autoIndexativado, a menos que você tenha uma situação específica em que ela esteja causando problemas; como se você deseja adicionar um novo índice a uma coleção existente que possui milhões de documentos e deseja ter mais controle sobre a criação.


10
Tenho uma pergunta a acrescentar ... E se eu definir como falso? Do que os índices serão criados quando eu inserir os dados ou preciso criá-los explicitamente. Lamento se esta é uma pergunta para iniciantes, mas seria realmente útil se você respondesse.
Saransh Mohapatra

5
@SaranshMohapatra Quando autoIndexfor falso, você precisará chamar o númeroIndicados no seu modelo para criar seus índices.
JohnnyHK

Do que terei que chamá-lo toda vez ou apenas uma vez definindo o modelo?
Saransh Mohapatra

@SaranshMohapatra quando você define (compila) seu modelo. Faço isso quando inicio o aplicativo. Agora, o mais difícil é decidir descartar todos os índices e recriá-los, caso o esquema seja alterado.
Moss

3
@JohnnyHK você ainda concorda com sua resposta agora que é quase 2016?
Alexander Mills

41

Embora eu concorde com a resposta aceita, vale a pena notar que, de acordo com o manual do MongoDB , essa não é a maneira recomendada de adicionar índices em um servidor de produção:

Se o seu aplicativo incluir operações assegureIndex () e um índice não existir para outras preocupações operacionais, a criação do índice poderá ter um impacto severo no desempenho do banco de dados.

Para evitar problemas de desempenho, verifique se o seu aplicativo verifica os índices na inicialização usando o método getIndexes () ou o método equivalente para o seu driver e termina se os índices adequados não existirem. Sempre crie índices em instâncias de produção usando código de aplicativo separado, durante as janelas de manutenção designadas.

Obviamente, isso realmente depende de como seu aplicativo é estruturado e implantado. Se você estiver implantando no Heroku, por exemplo, e não estiver usando o recurso de pré-inicialização do Heroku , é provável que seu aplicativo não esteja atendendo solicitações durante a inicialização e, portanto, provavelmente é seguro criar um índice nesse momento.

Além disso, a partir da resposta aceita:

Portanto, ele só afeta o desempenho quando você cria o índice pela primeira vez e, nesse momento, as coleções geralmente estão vazias; portanto, a criação de um índice seria rápida de qualquer maneira.

Se você conseguiu acertar o modelo de dados e as consultas na primeira vez, isso é bom e geralmente é o caso. No entanto, se você estiver adicionando uma nova funcionalidade ao seu aplicativo, com uma nova consulta ao banco de dados em uma propriedade sem um índice, geralmente se encontrará adicionando um índice a uma coleção que contém muitos documentos existentes.

Este é o momento em que você precisa ter cuidado ao adicionar índices e considerar cuidadosamente as implicações de desempenho de fazê-lo. Por exemplo, você pode criar o índice em segundo plano :

db.ensureIndex({ name: 1 }, { background: true });

3
Ok, então tudo que você precisa fazer é NÃO iniciar o servidor até que todos os retornos de chamada do CertifiqueIndex sejam acionados para cada coleção.
Alexander Mills

@AlexMills, como você garante isso?
26516 lonelymo

async.each (Object.keys (models), function (key, cb) {models [key] .ensureIndexes (cb)}, cb)
Alexander Mills

basta ligar para garantirIndexes em cada modelo de mangusto, aguardar o término de todos e iniciar o servidor; Também recomendo aguardar que as conexões com o banco de dados aconteçam antes de iniciar o servidor também
Alexander Mills

2
Não existe ensureIndexmais. Existe createIndexsim. Estou certo?
tomada em branco

1

use este código de bloco para lidar com o modo de produção:

const autoIndex = process.env.NODE_ENV !== 'production';
mongoose.connect('mongodb://localhost/collection', { autoIndex });
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.