2015-12-21 4 views
2

В настоящее время мы используем коллекцию под названием items, которые содержат 10 миллионов записей в нашей базе данных MongoDB.Проблемы с производительностью MongoDB

Эта коллекция содержит (среди многих других) две колонки с именем title и country_code. Одна такая запись выглядит следующим образом

{ 
    "_id": ObjectId("566acf868fdd29578f35e8db"), 
    "feed": ObjectId("566562f78fdd2933aac85b42"), 
    "category": "Mobiles & Tablets", 
    "title": "360DSC Crystal Clear Transparent Ultra Slim Shockproof TPU Case for Iphone 5 5S (Transparent Pink)", 
    "URL": "http://www.lazada.co.id/60dsc-crystal-clear-transparent-ultra-slim-shockproof-tpu-case-for-iphone-5-5s-transparent-pink-3235992.html", 
    "created_at": ISODate("2015-12-11T13:28:38.470Z"), 
    "barcode": "36834ELAA1XCWOANID-3563358", 
    "updated_at": ISODate("2015-12-11T13:28:38.470Z"), 
    "country_code": "ID", 
    "picture-url": "http://id-live.slatic.net/p/image-2995323-1-product.jpg", 
    "price": "41000.00" 
} 

Мощность на колонке country_code очень высока. Мы создали два текстовых индексов для этих столбцов:

db.items.createIndex({title: "text", country_code: "text"}) 

В наших примерах мы попытаемся запросить:

db.items.find({"title": { "$regex": "iphone", "$options": "i" }, country_code: "US"}).limit(10) 

запрос, который занимает около 6 секунд, чтобы закончить, который кажется необычно высоким для этого типа база данных.

Всякий раз, когда мы пробуем country_code (например, country_code: «UK»), который имеет меньше результатов, он будет возвращать результаты в миллисекундах.

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

EDIT: Все ответы здесь помогли, поэтому, если у вас есть эта проблема, попробуйте все три решения. Однако можно отметить только 1.

+0

Причина в том, что индексы ванили обычно не помогают с запросами на основе $ regex. Возможно, вам повезло с полнотекстовым индексом –

+0

, вы можете использовать .explain(), чтобы узнать, что происходит. – aabilio

+0

Не могли бы вы вывести вывод 'db.items.createIndex ({title:" text ", country_code:" text "}). Explain()' – Jaco

ответ

1

Включите порядок полей в вашем индексе. Вопросы для заказа.

db.items.createIndex({country_code: "text", title: "text"}) 

Убедитесь, что вы поддерживать этот порядок при запросе:

db.items.find({country_code: "US", "title": { "$regex": "iphone", "$options": "i" }}).limit(10) 

Что это будет сделать, это резко уменьшить количество title полей, нужно так поиск подстроки.

Также, как упоминалось @Jaco, вы должны использовать свой «текстовый» индекс. См. how to query a text index here.

0

Как сделать точный поиск по country_code, вы можете добавить текст индекса только title на:

db.items.createIndex({title:"text"}) 

и добавить отдельный индекс на country_code:

db.items.createIndex({country_code:1}) 

Как вы определили text индекс на title вам не нужно использовать регулярное выражение, но вместо этого вы можете выполнить текстовый поиск примерно так:

db.items.find({$text:{$search:"iphone"},country_code:"US"}) 
0

Вы должны создать индекс, такой как {country_code: 1, title: "text"}.

Equal намного быстрее, чем регулярное выражение, заставляя его считаться.

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