MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Как да оптимизирате MongoDB заявка с $gt и $lte?

Така че заявките с двоен диапазон не са препоръчителни в Mongo. Предполагам, че имате един индекс, съдържащ и двете {start_ip_num: 1, end_ip_num: 1} .

Ако това не ви доближи достатъчно (често все още е бавно, ако имате достатъчно данни, върнати от първото поле, тъй като трябва да извърши много сканиране на B-дърво), има един трик, който можете да направите, за да се борите с това използване на 2D заявки за кутии (работи само за два диапазона наведнъж).

По принцип поставяте 2D географски индекс в поле, съдържащо двете точки в масив, като [start_ip, end_ip], и му давате достатъчно висока минимална/максимална стойност, така че да не достигне границите, които по подразбиране са просто -180/180.

И накрая, използвайте заявка за граници с обхват от min до стойността $lte в единия ъгъл на кутията и gt и максималната стойност в другия ъгъл на кутията. Вижте http://www.mongodb.org/display/DOCS/ Geospatial+Indexing#GeospatialIndexing-BoundsQueries за синтаксис.

Изглежда по следния начин:

db.ip_ranges.find({ip_range:{$within:{$box:[[0, 1204135028], [1204135028, max]]}}});

където max е най-големият ip, който можете да имате.

Измина известно време, откакто гледах това, така че полето може да е грешно, но концепцията е здрава и направи заявките с двоен диапазон да се представят малко по-добре, отколкото с обикновения индекс на B-дърво с две полета. Постоянно под секунда (въпреки че обикновено няколкостотин милисекунди), в сравнение с няколко секунди с обикновения индекс - мисля, че имах стотици милиони документи по това време, но мина известно време, така че вземете тези запомнени показатели внимателно от солта. Сигурен съм, че резултатите ще варират значително в зависимост от вашите данни и размерите на диапазона.

Актуализация: Може да искате да експериментирате с bits настройка, опитвайки се с ниско и високо число, за да видите дали има разлика. За мен това не изглежда да повлияе средно на заявките. Вижте http://www.mongodb.org/display/DOCS/ Геопространствено+индексиране#GeospatialIndexing-Създаване на индекса за синтаксис.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Връзката на MongoDB към MongoLab изтича в NodeJS на Heroku

  2. Проверка дали съществува индекс в mongodb

  3. MongoDB NodeJS Роден драйвер (mongodb) срещу производителност на Mongo Shell

  4. Обединяване на връзки в Spring Boot и mongo db

  5. Mongodb NoRM и POCO