Текстовые данные обычных индексов неизменяемы, что означает, что для обновления данных нам необходимо выполнить полную переиндексацию. Во многих случаях переиндексация может занимать длительное время. Для этого используется main+delta schema .
Концепция предполагает большой индекс, содержащий снимок данных на определённый момент, и более мелкий индекс, который хранит изменения (дельту) с момента снимка до более текущей даты. Поскольку второй меньше, его можно переиндексировать чаще. Изменения дельты могут включать новые записи, обновлённые или удалённые записи. Обновлённые или удалённые записи создают проблему: когда движок ищет в обоих индексах, он не знает, что запись в основном индексе более не актуальна. Это приводит к тому, что продолжают отображаться записи, которые фактически удалены, или (в случае обновлённых записей) включаются старые версии записей вместо более новых из дельта‑индекса.
Для решения этой проблемы была введена функция kill-list . Kill-list определяет список идентификаторов документов в дельта‑индексе, который сообщает движку, что эти записи следует игнорировать в предыдущих индексах.
sql_query_killlist = \
SELECT id FROM documents WHERE updated_ts>=@last_reindex UNION \
SELECT id FROM documents_deleted WHERE deleted_ts>=@last_reindex
В этом примере мы включаем в kill-list идентификаторы документов, обновлённые после @last_reindex, даты последней переиндексации основного индекса, а также идентификаторы удалённых документов. Таблица documents_deleted может заполняться вручную при удалении записи из documents или с помощью триггера.
Важно помнить, что удаление в kill-list применяется к предшествующим индексам в том порядке, в котором они объявлены.
Если вы выполняете последовательный поиск по индексам, дельта должна идти после основного индекса.
mysql> SELECT * FROM main,delta WHERE MATCH('...');
То же самое применимо, если используется несколько дельт (например, delta_daily, delta_hourly), последовательность должна быть main,delta_daily,delta_hourly, а не main,delta_hourly,delta_daily.
Kill-list также используется в локальных распределённых индексах, и порядок определения индексов имеет значение и в этом случае, даже если мы выполняем параллельную обработку (используя dist_threads > 0) локальных индексов:
index dist
{
local = main
local = delta
}