如果指定其他WHERE条件,与FTS表的Select join查询会很慢。但是这些没有fts MATCH条件的WHERE条件并不慢,单独fts MATCH也不慢。如何将MATCH条件和其他WHERE条件结合起来而不减慢查询速度
posts 表有 100,000 行, posts.deleted_at 和 posts.root_id 列创建了索引, posts_fts 表是使用 sqlite fts5 扩展创建的。 SQLite 3版本是3.40。
查询 1 很快。查询在 0.078 秒内完成。
SELECT count(posts.id) AS count FROM posts
WHERE posts.deleted_at IS NULL AND posts.root_id IN (12)
--
查询 2 很快。查询在 0.003 秒内完成。
SELECT count(posts.id) as count FROM posts
JOIN posts_fts on posts.id = posts_fts.rowid
WHERE posts_fts match 'aqua* avai*'
--
但是这个组合查询速度很慢。查询在 6.783 秒内完成。
SELECT count(posts.id) AS count FROM posts
JOIN posts_fts ON posts.id = posts_fts.rowid
WHERE posts.root_id IN (12) AND posts.deleted_at IS NULL
AND posts_fts MATCH 'aqua* avai*'
--
这个替代版本也很慢。查询在 6.835 秒内完成。
SELECT count(posts.id) AS count FROM posts
JOIN
(SELECT rowid AS id, rank FROM posts_fts WHERE posts_fts MATCH 'aqua* avai*') fts
ON fts.id = posts.id
WHERE posts.root_id IN (12) AND posts.deleted_at IS NULL
--
但是这个版本很快。查询在 0.002 秒内完成。
SELECT count(posts.id) AS count FROM posts
WHERE posts.id IN
(SELECT rowid FROM posts_fts WHERE posts_fts MATCH 'aqua* avai*')
AND posts.root_id IN (12) AND posts.deleted_at IS NULL
但是在这个版本中,我无法正确使用 fts 表中的排名。
我需要加入 posts_fts 表才能在 ORDER BY 子句中使用排名
请告诉我如何加快组合查询速度
这里组合查询很慢,因为在 posts.root_id 列上创建了索引。我删除了这个索引,现在查询在 0.003 秒内完成。 posts.root_id 列只有 10 个不同的值,这不足以正确使用索引。不正确的索引与连接查询相结合导致查询缓慢。
更多信息在这里:
性能 - 为什么当我索引列时这个 sqlite 查询要慢得多? - 数据库管理员堆栈交换
sql - 即使使用索引,大型数据库中的查询也非常慢 - Thinbug