Мы накопили большое количество индексов в одной из наших коллекций mongodb, и было бы неплохо удалить некоторые из них, если это возможно. Однако довольно сложно узнать, какие индексы активно используются приложением, а какие (если таковые имеются) уже устарели.
Кто-нибудь знает какие-либо инструменты / методы для анализа используемых индексов?
Изменить: Mongo v3.0.5
К сожалению, MongoDB 3.0 не имеет прямого метода определения неиспользуемых индексов.
MongoDB 3.2 улучшает это с введением $ indexStats, который показывает доступ к индексу: https://docs.mongodb.com/manual/reference/operator/aggregation/indexStats/
Несколько предложений:
Попытайтесь определить любые индексы, которые могут быть префиксами друг друга, поскольку они могут быть избыточными. Помните, что порядок индексов может иметь значение.
Как упоминал Джейкоб, использование плана объяснения может помочь определить, использует ли запрос индекс. PlanCache.getPlansByQuery () расширяет это, показывая, какие планы запросов в настоящее время кэшируются в базе данных для определенных шаблонов запросов: https://docs.mongodb.com/v3.0/reference/method/PlanCache.getPlansByQuery/#PlanCache.getPlansByQuery
После публикации MongoDB 3.2 у вас есть $ indexStats, который позволяет узнать, какие индексы используются и в какой степени. Я собрал сообщение в блоге об этом - https://scalegrid.io/blog/how-to-find-unused-indexes-in-mongodb/
Вы можете использовать query.explain () для отдельных запросов, чтобы получить план запроса для этого запроса. Вы можете узнать об этом подробнее здесь. https://docs.mongodb.com/manual/reference/method/cursor.explain/
Другие вещи, которые вы можете захотеть изучить:
В выводе serverStatus:
scanned
scanAndOrder
В выводе collStats:
totalIndexSize
indexSizes
В выводе dbStats:
dbStats.indexes
dbStats.indexSize