纯文本索引数据是不可变的,这意味着要刷新数据,我们需要进行完全重建索引。在许多情况下,重建索引可能需要很长时间。为此,使用了 main+delta schema 。
这个概念假设一个大的索引,它在给定时间保存数据的快照,以及一个较小的索引,它保存从快照时间到更近日期的变化(增量)。由于后者较小,因此可以更频繁地重新索引。增量变化可以是新记录、更新的记录或删除的记录。更新或删除的记录引入了一个问题:当引擎在两个索引中搜索时,它不知道主索引中的记录是否不再有效。这导致继续显示实际上已删除的记录,或者(在更新记录的情况下)包含旧版本的记录,而不是来自增量索引的新版本。
为了解决这个问题,引入了 kill-list 功能。kill-list 定义了增量索引中一组文档 ID,告诉引擎这些记录在之前的索引中应该被忽略。
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 更新的文档 ID,即上次主索引发生的日期,以及已删除的文档 ID。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
}