SQLite 来自两个快速 SELECT 查询的慢速组合查询

问题描述 投票:0回答:1

如果指定其他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 子句中使用排名

请告诉我如何加快组合查询速度

sqlite join subquery full-text-search fts5
1个回答
0
投票

这里组合查询很慢,因为在 posts.root_id 列上创建了索引。我删除了这个索引,现在查询在 0.003 秒内完成。 posts.root_id 列只有 10 个不同的值,这不足以正确使用索引。不正确的索引与连接查询相结合导致查询缓慢。

更多信息在这里:

性能 - 为什么当我索引列时这个 sqlite 查询要慢得多? - 数据库管理员堆栈交换

https://dba.stackexchange.com/questions/150858/why-is-this-sqlite-query-much-slower-when-i-index-the-columns

sql - 即使使用索引,大型数据库中的查询也非常慢 - Thinbug

即使使用索引,大型数据库中的查询也非常慢

© www.soinside.com 2019 - 2024. All rights reserved.