2016-05-25 4 views
3

Я изучал представление mongodb. У меня есть коллекция из 500 миллионов документов. Я создал два индекса:mongodb - счет улучшает производительность

db.appels.createIndex({OPERATEUR_RECEVEUR:1}); 
db.appels.createIndex({DUREE_APPEL:1}); 

счетчик на поле, быстро:

15 секунд:

db.appels.find ({ "DUREE_APPEL" : { "$gt" : 42 } }).count(); 

2 секунды:

db.appels.find({OPERATEUR_RECEVEUR:"MTN"}).count(); 

Но рассчитывать на два поля с «и» медленно:

7 минут:

db.appels.find ({ $and : [ { "DUREE_APPEL" : { "$gt" : 42 } }, {OPERATEUR_RECEVEUR:"MTN"} ] }).count(); 

(Это то же самое время, без индекса поля)

Наконец, рассчитывают на двух полей с «или» невозможно:

15 часов и убить запрос:

db.appels.find ({ $or : [ { "DUREE_APPEL" : { "$gt" : 42 } }, {OPERATEUR_RECEVEUR:"MTN"} ] }).count(); 

Я не могу использовать мультииндекс, потому что у меня есть 100 столбцов. Я использую 1 узел с debian 8, 2 SSD, 80 Go Ram, 12 Cpu, mongodb 2.4. Как я могу улучшить скорость?

+2

Почему вы не можете создать индекс на двух полях? В вашем случае DUREE_APPEL и OPERATEUR_RECEVEUR. См. Https://docs.mongodb.com/manual/core/index-compound/ – Saleem

+0

Благодарим вас за ответ. Я не знаю заранее, какой запрос или сколько полей будет использовано (иногда 1, иногда 2, .., ..., иногда 10). Запрос динамически генерируется в соответствии с выбором конечного пользователя в веб-интерфейсе. Если у меня есть 100 столбцов, у меня есть тысячи индексов для создания. –

+0

Ну, если вы не знаете заранее, я бы предложил создать индекс для каждого поля. Я знаю, что ваши индексы будут использовать дополнительные ресурсы, но увеличит пользовательский интерфейс, быстро вернув данные. – Saleem

ответ

0

Я обнаружил, что это «счет» идет медленно, а не исследование. На одних и тех же полях время отклика пропорциональна числу результата

"DUREE_APPEL": { "$ GT": 42} -> 198 757 639 записей -> 32 сек

"DUREE_APPEL" : { "$ GT": 800} -> 11 479 097 запись -> 1,9 секунды

"DUREE_APPEL": { "$ GT": 5000} -> 833 961 запись -> 0,14 второй

Индексы - не единственное решение, как решить эту проблему?

Используется ошпаривание (50 миллионов линий с 10 узлами) может быть решением? : https://docs.mongodb.com/manual/sharding/

Pierre

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