2015-05-28 2 views
1

У меня есть коллекция MongoDB с большим количеством индексов.Как можно обнаружить «бесполезные» индексы?

ли это принесет какие-либо выгоды для удаления индексов, которые едва используются?

Есть ли способ или инструмент, который может мне сказать (в цифрах), как часто используется индекс?

EDIT: Я использую версию 2.6.4

edit2: Я сейчас использую версию 3.0.3

+0

http://docs.mongodb.org/manual/tutorial/measure-index-use/ – chridam

+0

Я уже был там. Но я честно не понимаю, как это помогает мне. –

+0

Хмм, нет простого способа, даже если вы сами его кодируете, вручную обрабатывая каждый запрос и отмечая индекс как полезный beng, а затем удаляя все те, которые не отмечены – Sammaye

ответ

2

Право, так это то, как я буду это делать.

Сначала вам нужен список всех индексов для некоторого набора (это будет сделано коллекция по коллекции). Скажем, мы контролируем 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, который по существу проходит через мои активные модели записей и обнаруживает, какие индексы я больше не использую и удалил из своего приложения, и удаляет их по очереди. Разумеется, это создаст новые индексы.

+0

Thnak вас. По крайней мере, я могу узнать, что индексы hwat используются. –

+0

Помните, какая версия была способна индексировать статистику за несколько раз, когда был поражен индекс? –

+0

@PhilippSander Я думаю, что 1.6 Я бы действительно рекомендовал не понижать рейтинг. Если они удалили его (что, по-видимому, так), они сделали по уважительной причине, скорее всего, какое-то положение сделало стат бесполезным – Sammaye

Смежные вопросы