我试图在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上,这样的查询工作正常且快速(<0.2s);在sqlite3上,对于相同的数据,它运行~2s。
可能是什么问题,我该怎么做才能改善其表现?
我在这里可以找到我测试sqlite3的文件:https://github.com/HoverHell/sqlperftst1
特别是表格定义:
CREATE TABLE "node" (
"id" integer PRIMARY KEY,
"loc" varchar(255) NOT NULL,
"weight" real
);
CREATE INDEX "node_loc" ON "node" ("loc");
CREATE INDEX "node_weight" on "node" ("weight");
CREATE TABLE "filt" (
"id" integer PRIMARY KEY,
"node_id" integer NOT NULL,
"word" varchar(120) NOT NULL
);
CREATE INDEX "filt_word" ON "filt" ("word");
CREATE INDEX "filt_node_id" ON "filt" ("node_id");
UPD:对现实数据和查询的性能比较:
答案 0 :(得分:0)
可以通过在用于查找的两列上创建索引来改进此查询:
CREATE INDEX filt_word_node_id ON file(word, node_id);
然而,tje数据的形状是不寻常的,这使得查询优化器错误地认识了单词查找的选择性。 运行ANALYZE来解决此问题。