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