SQLite 提供全文搜索,我假设这就是您从表名中使用的内容。我将使用 FTS5 显示示例代码,但如果需要,您可以向后调整它。如果您有一个 users 表,例如:
CREATE TABLE users(
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
surname TEXT NOT NULL
);
然后您使用以下内容创建了全文搜索表:
CREATE VIRTUAL TABLE users_fts USING fts5(
name,
surname,
content='user',
content_rowid='id'
);
此时,您必须确保为全文搜索建立了users 表中的记录的索引,这可以使用users 表上的触发器自动完成。触发器如下所示:
CREATE TRIGGER users_ai AFTER INSERT ON users
BEGIN
INSERT INTO users_fts (rowid, name, surname)
VALUES (new.id, new.name, new.surname);
END;
CREATE TRIGGER users_ad AFTER DELETE ON users
BEGIN
INSERT INTO users_fts (users_fts, rowid, name, surname)
VALUES ('delete', old.id, old.name, old.surname);
END;
CREATE TRIGGER users_au AFTER UPDATE ON users
BEGIN
INSERT INTO users_fts (users_fts, rowid, name, surname)
VALUES ('delete', old.id, old.name, old.surname);
INSERT INTO users_fts (rowid, name, surname)
VALUES (new.id, new.name, new.surname);
END;
完成所有这些后,您现在可以使用users_fts 表执行全文搜索。
那么users 表上的索引如何影响users_fts 表呢?如果您只使用users_fts 表进行搜索,则users 表上的索引无关紧要。我不知道您打算如何填充users_fts 表,但如果您在users 表上使用触发器,那么users 表上的建议索引仍然无关紧要。如果您手动使users_fts 表保持最新状态,那么答案是users 表上的索引可能会影响性能。我认识的大多数人都使用触发器方法,这就是我所做的,它让您忘记手动维护全文搜索,并且您可以获得额外的好处,您可以在填充全文搜索时忽略源表上的索引。请记住,虽然这是您根本不查询 users 表的场景 - 如果您对 users 表有任何查询,那么您可能需要支持索引。
您还询问了使用users_fts 表进行查询的方法是否有任何注意事项 - 只要您保持users_fts 表为最新,那么这种方法就没有缺点。如果您需要全文搜索功能和排名,这是一种融入 SQLite 的非常方便的方法。这将需要更多的存储空间,但您可以通过使用外部内容表来最小化这种影响(我在创建 users_fts 表时展示了这一点)。您可以在https://www.sqlite.org/fts5.htmlhttps://www.sqlite.org/fts5.html的 FTS5 扩展文档的第 4.4.2 节中阅读有关它的一些详细信息
这种方法适用于全文搜索功能,只要您维护索引,它应该可以很好地工作并为您提供更多搜索和排名功能。根据我的经验,大多数全文搜索都比使用标准 SQL 函数和运算符(例如 LIKE 等)更快,而且功能更强大。