<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://support.qbpro.ru/index.php?action=history&amp;feed=atom&amp;title=MongoDB%3A_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%B4%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D1%8C_%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%BE%D0%B2_%D0%BD%D0%B0_%D0%B4%D0%B8%D0%B0%D0%BF%D0%B0%D0%B7%D0%BE%D0%BD%D0%B0%D1%85</id>
	<title>MongoDB: производительность запросов на диапазонах - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://support.qbpro.ru/index.php?action=history&amp;feed=atom&amp;title=MongoDB%3A_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%B4%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D1%8C_%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%BE%D0%B2_%D0%BD%D0%B0_%D0%B4%D0%B8%D0%B0%D0%BF%D0%B0%D0%B7%D0%BE%D0%BD%D0%B0%D1%85"/>
	<link rel="alternate" type="text/html" href="https://support.qbpro.ru/index.php?title=MongoDB:_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%B4%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D1%8C_%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%BE%D0%B2_%D0%BD%D0%B0_%D0%B4%D0%B8%D0%B0%D0%BF%D0%B0%D0%B7%D0%BE%D0%BD%D0%B0%D1%85&amp;action=history"/>
	<updated>2026-04-03T19:02:07Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.38.1</generator>
	<entry>
		<id>https://support.qbpro.ru/index.php?title=MongoDB:_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%B4%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D1%8C_%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%BE%D0%B2_%D0%BD%D0%B0_%D0%B4%D0%B8%D0%B0%D0%BF%D0%B0%D0%B7%D0%BE%D0%BD%D0%B0%D1%85&amp;diff=573&amp;oldid=prev</id>
		<title>imported&gt;Vix: Новая страница: «[http://myforce.ru/tyeoriya-i-praktika/mongodb-proizvoditelnost-zaprosov-na-diapazonax/ источник]  Если вы путешествовали по тер…»</title>
		<link rel="alternate" type="text/html" href="https://support.qbpro.ru/index.php?title=MongoDB:_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%B4%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D1%8C_%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%BE%D0%B2_%D0%BD%D0%B0_%D0%B4%D0%B8%D0%B0%D0%BF%D0%B0%D0%B7%D0%BE%D0%BD%D0%B0%D1%85&amp;diff=573&amp;oldid=prev"/>
		<updated>2013-08-24T10:48:40Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «[http://myforce.ru/tyeoriya-i-praktika/mongodb-proizvoditelnost-zaprosov-na-diapazonax/ источник]  Если вы путешествовали по тер…»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[http://myforce.ru/tyeoriya-i-praktika/mongodb-proizvoditelnost-zaprosov-na-diapazonax/ источник]&lt;br /&gt;
&lt;br /&gt;
Если вы путешествовали по территории индексов MongoDB, вы возможно слышали принцип: Если ваши запросы содержат сортировку, то добавте сортированное поле в конец индекса который используется в этих запросах. Во многих случаях когда запросы содержат условия равенства как например {“name”: “Charlie”}, принцип который выше очень полезен.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Но что о нем можно сказать со следующим примером:&lt;br /&gt;
&lt;br /&gt;
Запрос: '''db.drivers.find({&amp;quot;country&amp;quot;: {&amp;quot;$in&amp;quot;: [&amp;quot;A&amp;quot;, &amp;quot;G&amp;quot;]}).sort({&amp;quot;carsOwned&amp;quot;: 1})''' &lt;br /&gt;
&lt;br /&gt;
Индекс: '''{&amp;quot;country&amp;quot;: 1, &amp;quot;carsOwned&amp;quot;: 1}''' &lt;br /&gt;
&lt;br /&gt;
Эта связка является не эффективной, хотя принцип соблюдается. Потому что тут есть ловушка в которую вас может привести этот принцип.&lt;br /&gt;
Ниже мы рассмотрим причины возниконвения этой ловушки и к концу статьи вы будете иметь новое правило которое будет вам помогать при индексировании.&lt;br /&gt;
&lt;br /&gt;
Давайте вспомним основы из документации MongoDB:&lt;br /&gt;
&lt;br /&gt;
*«Индексы рано»&lt;br /&gt;
Индексы заслуживают рассмотрения в начале проектирования. Исторический, эффективность на уровне доступа к данным была переложена на администраторов баз данных, это создавало слой оптимизации после проектирования.&lt;br /&gt;
С документо-ориентированныим базами данных есть возможность этого избежать.&lt;br /&gt;
*«Индексы часто»&lt;br /&gt;
Индексированные запросы работают лучше на несколько порядков, даже на маленьких данных. В то время как без индекса запрос может занять 10 секунд, тот же запрос может занять 0 милисекунд с соответсвующим индексом.&lt;br /&gt;
*«Индексы полностью»&lt;br /&gt;
Запросы используют индексы слева направо. Индекс может быть использован только при условии что запрос использует все поля в индексе без пропусков.&lt;br /&gt;
*«Сортировка индекса»&lt;br /&gt;
Если ваш запрос будет содержать сортировку, то добавте сортированное поле в ваш индекс.&lt;br /&gt;
*«Команды»&lt;br /&gt;
:.explain() покажет какой индекс используется для данного запроса.&lt;br /&gt;
:.ensureIndex() создает индексы.&lt;br /&gt;
:.getIndexes() и .getIndexKeys() покажут какие индексы у вас есть.&lt;br /&gt;
&lt;br /&gt;
Теперь вернемся к нашему вопросу. С учетом основ индексации, для следующего запроса:&lt;br /&gt;
&lt;br /&gt;
'''db.collection.find({&amp;quot;country&amp;quot;: &amp;quot;A&amp;quot;}).sort({&amp;quot;carsOwned&amp;quot;: 1})'''&lt;br /&gt;
&lt;br /&gt;
Мы должны создать такой индекс:&lt;br /&gt;
&lt;br /&gt;
'''db.collection.ensureIndex({&amp;quot;country&amp;quot;: 1, &amp;quot;carsOwned&amp;quot;: 1})'''&lt;br /&gt;
&lt;br /&gt;
Что если большинство запросов в условии используют выбор диапазона вместо сравнения? Как в этом:&lt;br /&gt;
&lt;br /&gt;
'''db.collection.find({&amp;quot;country&amp;quot;: {&amp;quot;$in&amp;quot;: [&amp;quot;A&amp;quot;, &amp;quot;G&amp;quot;]}}).sort({&amp;quot;carsOwned&amp;quot;: 1})'''&lt;br /&gt;
&lt;br /&gt;
Здесь мы использовали оператор $in, но кроме него есть ещё такие как: $gt, $lt, и др.&lt;br /&gt;
&lt;br /&gt;
Если вы будете использовать подобный запрос, вы увидите что он не эффективен, при этом вы помните основы — нужно запустить .explain() и посмотреть какой индекс используется и как.&lt;br /&gt;
&lt;br /&gt;
В результате выполнения .explain() Вы увидите {scanAndOrder: true}, что значит MongoDB выполняет сортировочные операции, а это дорогая операция т.к. MongoDB сортирует документы в памяти. Поэтому Вы должны избегать большых наборов данных т.к. это медленно и ресурсоемко.&lt;br /&gt;
&lt;br /&gt;
Не нужно забывать, почему scanAndOrder медленный, почему MongoDB сортирует результат хотя у нас уже есть индекс с сортировкой? Ответ простой: у нас нет подходящего индекса.&lt;br /&gt;
&lt;br /&gt;
Почему? Причина проста, дело в структуре индекса который мы создали. Для примера выше, документы имеющие {“country”: “A”} и документы имеющие {“country”: “G”} отсортированы в индиксе по {“carsOwned”: 1},&lt;br /&gt;
но они сортируются независимо друг от друга. Они не отсортированы вместе! Рассмотрим диаграмму ниже:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Da802597c38b2b62a9a18b08fa2265ae.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
На левой схеме показан порядок обхода документов по индексу который мы создали. После того как все документы будут найдены, их нужно будет отсортировать.&lt;br /&gt;
&lt;br /&gt;
На правой схеме альтернативный индекс '''{ “carsOwned”: 1, “country”: 1}'''. В этом случае найденые документы будут уже в отсортированном виде.&lt;br /&gt;
&lt;br /&gt;
Этот тонкий момент эффективности привел к следующим правилам при индексации:&lt;br /&gt;
&lt;br /&gt;
Порядок полей должен быть:&lt;br /&gt;
&lt;br /&gt;
1. Сначала поля которые отбираются по точным значениям.&lt;br /&gt;
&lt;br /&gt;
2. Далее поля по которым будет идти сортировка.&lt;br /&gt;
&lt;br /&gt;
3. И в конце поля для диапазонного фильтра.&lt;br /&gt;
&lt;br /&gt;
Концовка&lt;br /&gt;
&lt;br /&gt;
Есть ли компроммис? Да. Запрос будет посещать несколько узлов индекса, что технический необходимо, т.к. обход сортированной части будет происходить до отфильтровывания.&lt;br /&gt;
Таким образом новое правило как чистая прибль для многих запросов, но не забывайте что сложность ваших данных может приводить к различным результатам.&lt;/div&gt;</summary>
		<author><name>imported&gt;Vix</name></author>
	</entry>
</feed>