Право, так это то, как я буду это делать.
Сначала вам нужен список всех индексов для некоторого набора (это будет сделано коллекция по коллекции). Скажем, мы контролируем user
коллекции, чтобы увидеть, какие индексы бесполезны.
Так что я запустить db.user.getIndexes()
и это приводит к оформленному выводу JSON (вы можете запустить через command()
со стороны клиента, а также для интеграции с помощью скрипта).
Так теперь у вас есть список ваших индексов. Это всего лишь случай понимания того, какие запросы используют индексы. Если этот индекс не ударит, вы знаете, что это бесполезно.
Теперь вам нужно запустить каждый запрос с помощью explain()
с этого вывода, вы можете судить, какой индекс используется и соответствовать ему, и индекс получил от getIndexes()
.
Так вот пример вывода:
> db.user.find({religion:1}).explain()
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "meetapp.user",
"indexFilterSet" : false,
"parsedQuery" : {
"religion" : {
"$eq" : 1
}
},
"winningPlan" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"religion" : NumberLong(1)
},
"indexName" : "religion_1",
"isMultiKey" : false,
"direction" : "forward",
"indexBounds" : {
"religion" : [
"[1.0, 1.0]"
]
}
}
},
"rejectedPlans" : [ ]
},
"serverInfo" : {
"host" : "ip-172-30-0-35",
"port" : 27017,
"version" : "3.0.0",
"gitVersion" : "a841fd6394365954886924a35076691b4d149168"
},
"ok" : 1
}
Есть набор правил, что queryPlanner
поле будет использовать и вам нужно будет открыть и писать для них, но это первый один достаточно просто.
Как вы можете видеть: выигрышный план (в winningPlan
) является единственным (может быть несколько помните, этот материал вам нужно закодировать вокруг) IXSCAN
(индекс сканирования) и ключ шаблон для индекса используемого:
"keyPattern" : {
"religion" : NumberLong(1)
},
Отлично, теперь мы можем соответствовать ключевой вывод getIndexes()
:
{
"v" : 1,
"key" : {
"religion" : NumberLong(1)
},
"name" : "religion_1",
"ns" : "meetapp.user"
},
, чтобы говорит нам о том, что индекс religion
не бесполезна и фактически используется.
К сожалению, это самый лучший способ, которым я могу видеть. Раньше считалось, что MongoDB имел индекс стат для числа раз, индекс был поражен, но, кажется, что данные были удалены.
Итак, вы просто промойте и повторите этот процесс для каждой коллекции, которую вы имеете до тех пор, пока не удалите ненужные индексы.
Еще один способ сделать это, конечно, удалить все индексы, а затем повторно добавить индексы, как вы проверить свои запросы. Хотя это может быть плохо, если вам нужно сделать это на производстве.
На стороне записки: лучший способ решить эту проблему, чтобы не иметь его вообще.
Я делаю это проще для меня, используя функцию индексирования в своей активной записи. Каждый раз так часто я запускаю (из PHP) что-то вроде этого: ./yii index/rebuild
, который по существу проходит через мои активные модели записей и обнаруживает, какие индексы я больше не использую и удалил из своего приложения, и удаляет их по очереди. Разумеется, это создаст новые индексы.
http://docs.mongodb.org/manual/tutorial/measure-index-use/ – chridam
Я уже был там. Но я честно не понимаю, как это помогает мне. –
Хмм, нет простого способа, даже если вы сами его кодируете, вручную обрабатывая каждый запрос и отмечая индекс как полезный beng, а затем удаляя все те, которые не отмечены – Sammaye