MongoDB Запрос для записей с несуществующим полем и индексацией - PullRequest
4 голосов
/ 21 сентября 2011

У нас есть база данных Монго с около 1 млн документов, и мы хотим опросить эту базу данных, используя обработанное поле, чтобы найти документы, которые мы не видели раньше. Для этого мы устанавливаем новое поле с именем _processed.

Для запроса документов, которые необходимо обработать, мы запрашиваем документы, которые не имеют этого обработанного поля:

db.stocktwits.find({ "_processed" : { "$exists" : false } })

Однако этот запрос каждый раз занимает около 30 секунд, что довольно медленно. Существует индекс (asc), который находится в поле _processed:

db.stocktwits.ensureIndex({ "_processed" : -1 },{ "name" : "idx_processed" });

Добавление этого индекса не влияет на производительность запросов. В коллекции есть несколько других индексов (а именно идентификатор idx и уникальный индекс пары полей в каждом документе).

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

Мы попытались использовать запрос $ where (т. Е. $where : this._processed==null), чтобы сделать то же самое, что и $exists : false, и производительность примерно такая же (несколько секунд медленнее, что имеет смысл) ...

Есть какие-нибудь идеи о том, что могло бы стать причиной медленной работы (или это нормально)? У кого-нибудь есть предложения по улучшению скорости запросов?

Ура!

Ответы [ 2 ]

5 голосов
/ 21 сентября 2011
4 голосов
/ 21 сентября 2011

Это медленно, потому что проверка на _processed -> not exists не дает большой избирательности.Это похоже на индекс «Gender» - и поскольку есть только два возможных варианта male или female, тогда, если у вас есть 1M строк и индекс на Gender, ему придется сканировать 50% или 500K строк, чтобы найтивсе мужчины.

Вы должны сделать свой индекс более избирательным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...