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