sqlite3按性能加入筛选器顺序

sqlite3按性能加入筛选器顺序,sqlite,Sqlite,我尝试在sqlite3数据库上执行类似的查询: select node.loc, node.weight from node inner join filt on (node.id = filt.node_id) inner join filt T5 on (node.id = T5.node_id) where (filt.word = 'aaa' and T5.word = 'aasvogel') order by node.weight desc limit 10; 在mysql上,这样

我尝试在sqlite3数据库上执行类似的查询:

select node.loc, node.weight from node
inner join filt on (node.id = filt.node_id)
inner join filt T5 on (node.id = T5.node_id)
where (filt.word = 'aaa' and T5.word = 'aasvogel')
order by node.weight desc limit 10;

在mysql上,这样的查询工作良好且快速可以通过在用于查找的两列上创建索引来改进此查询:

CREATE INDEX filt_word_node_id ON file(word, node_id);
然而,tje数据的形状是不寻常的,这使得查询优化器错误地估计了单词查找的选择性。
运行以修复此问题。

将表定义放入问题中。完成,@CL.a尽管链接存储库中有两处相同的表定义。请阅读。我想您的意思是在filt word、node\u id上创建索引filt\u word\u node\u id;真空分析尽管这仍然没有多大帮助;查询仍然需要一秒钟的时间。SQLite 3.8.6速度很快。谢谢,SQLite 3.8有点帮助;虽然随着数据的增大和筛选器联接的增多,性能仍会迅速降低。但您可以通过在查询中使用按节点\权重索引的from node替换from node来强制执行另一个查询计划。但这会绕过此表的查询计划器,如果数据的形状稍后发生更改,则可能会变慢。
CREATE INDEX filt_word_node_id ON file(word, node_id);