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

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

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

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 указываются в миллисекундах.

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

sql_ranged_throttle = 1000 # sleep for 1 sec before each query step
Last modified: August 28, 2025