Текстовые данные обычных индексов неизменяемы, что означает, что для обновления данных нам необходимо выполнить полную переиндексацию. Во многих случаях переиндексация может занимать длительное время. Для этого используется 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
}