sqlite3 join-filter order-by performance

时间:2014-11-18 15:34:12

标签: 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上,这样的查询工作正常且快速(<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:对现实数据和查询的性能比较:

Perofrmance comparison on realistic data and queries

1 个答案:

答案 0 :(得分:0)

可以通过在用于查找的两列上创建索引来改进此查询:

CREATE INDEX filt_word_node_id ON file(word, node_id);

然而,tje数据的形状是不寻常的,这使得查询优化器错误地认识了单词查找的选择性。 运行ANALYZE来解决此问题。