# Диапазонные запросы


Основной запрос, который должен извлечь все документы, может наложить блокировку чтения на всю таблицу и задержать параллельные запросы (например, INSERTы в таблицу MyISAM), расходовать много памяти на результирующий набор и т.д. Чтобы избежать этого, Manticore поддерживает так называемые *диапазонные запросы*. С помощью диапазонных запросов Manticore сначала получает минимальные и максимальные ID документов из таблицы, а затем подставляет различные интервалы ID в основной текст запроса и выполняет модифицированный запрос для извлечения другой части документов. Вот пример.

Пример использования диапазонного запроса:

```ini
sql_query_range = SELECT MIN(id),MAX(id) FROM documents
sql_range_step = 1000
sql_query = SELECT * FROM documents WHERE id>=$start AND id<=$end
```

Если таблица содержит ID документов от 1 до, скажем, 2345, то sql_query будет выполнен три раза:

1.  с заменой `$start` на 1 и `$end` на 1000;
2.  с заменой `$start` на 1001 и `$end` на 2000;
3.  с заменой `$start` на 2001 и `$end` на 2345.

Очевидно, что для таблицы из 2000 строк это не особо большая разница, но при индексации таблицы с 10 миллионами строк диапазонные запросы могут оказаться полезными.

### sql_query_range

Определяет диапазонный запрос. Запрос, указанный в этой опции, должен получить минимальные и максимальные ID документов, которые будут использоваться в качестве границ диапазона. Он должен возвращать ровно два целочисленных поля: сначала min ID, потом max ID; имена полей игнорируются. При включении данной опции `sql_query` должен содержать макросы $start и $end. Обратите внимание, что интервалы, указанные как $start..$end, не будут пересекаться, поэтому вам не следует исключать из запроса документы, ID которых точно равен $start или $end.

### sql_range_step

Этот параметр задает шаг диапазонного запроса. Значение по умолчанию — 1024.

### sql_ranged_throttle

Эта директива может использоваться для ограничения скорости диапазонного запроса. По умолчанию ограничений нет. Значения для sql_ranged_throttle указываются в миллисекундах.

Ограничение скорости может быть полезно, когда индексатор создаёт слишком большую нагрузку на сервер баз данных. Оно заставляет индексатор приостанавливаться на заданное время один раз за каждый шаг диапазонного запроса. Эта пауза выполняется безусловно и происходит до выполнения запроса на выборку.

```ini
sql_ranged_throttle = 1000 # sleep for 1 sec before each query step
```
<!-- proofread -->

