Quais opções eu tenho para ajustar o MongoDB/TokuMX para ler os resultados de consultas com grandes conjuntos de resultados? Atualmente, estou em um único servidor (sem sharding) com os dados em uma unidade SSD. Minhas consultas são simplesmente {field: value}
com um índice no campo. A coleção tem ~1B de registros, dos quais estou recuperando ~50M.
Olhando para cima, parece que há picos alternados de CPU mongod (~ 200% CPU, ou seja, 100% de 2 núcleos) e momentos em que parece que mongod está esperando por IO.
Que tipo de coisas posso tentar para melhorar o tempo de consulta?
A primeira coisa a olhar é
db.serverStatus().ft
. Isso tem várias métricas que podem ser úteis para descobrir onde você está gastando tempo. Estes estão documentados aqui: http://docs.tokutek.com/tokumx/tokumx-server-status.htmlNormalmente, a maneira de melhorar o tempo de consulta é garantir que você tenha o índice correto para sua consulta. Você pode estar fazendo uma consulta
{field: value}
e ter um índice em{field: 1}
, mas se não estiver projetando em sua consulta, ainda estará fazendo muitas consultas pontuais de volta ao índice de chave primária para obter o documento completo, o que é muito ineficiente . Você pode querer adicionar outros campos ao índice para torná-lo abrangente e, em seguida, projetar para esses campos, por exemplo, indexar{field: 1, other: 1, fields: 1}
e, em seguida, certifique-se de projetar em sua consulta comodb.foo.find({field: "val"}, {field: 1, other: 1, fields: 1})
.Como alternativa, você pode usar uma chave primária personalizada se essas
{field: 1, _id: 1}
forem suas consultas mais comuns ou, em vez disso, apenas criar a chave secundária em{field: 1}
uma chave de agrupamento .Se você quiser mais ajuda, seria ótimo se você pudesse fornecer sua configuração de servidor, esquema de coleção (
db.foo.getIndexes()
está bem) e estatísticas (db.foo.stats()
), consultas de amostra realistas e cardinalidade e saída de arquivosdb.serverStatus().ft
.