如何优化FTS3的联接(文本)

时间:2018-09-25 06:55:25

标签: sqlite

  1. FTS3的功能是否可以在JOIN查询中快速运行?
  2. 如果有帮助,请指导我转换表格。我有2个具有数百万条记录(边缘和节点)的表。我必须将它们加入2列,其中列的内容是文本。 基本的工作查询是(但很慢):

    select * from EDGES
    inner join NODES on EDGES.sourcename = NODES.name
    or EDGES.targetname = NODES.name
    
  3. 如果没有,是否有任何更快的方法来获得结果?数据库为15GB,此查询可能需要2天以上的时间。

桌子就像

allNODES之间感兴趣的NODES是:

name        address
---------------------
yahoo       yahoo.com
google      google.com
MSN         MSN.com

所有边缘

sourcename     targetname 
--------------------------
MSN            google
yahoo          google
google         MSN
amazon         google
amazon         yahoo
yahoo          amazon
amazon         stackoverflow
stackoverflow  amazon
MSN            amazon

结果可能看起来像这样:

sourcename     targetname 
--------------------------
MSN            google
yahoo          google
google         MSN
amazon         google
amazon         yahoo
yahoo          amazon
MSN            amazon

1 个答案:

答案 0 :(得分:0)

我仍然不清楚您要如何获得结果,但是您可以通过做一些基本的清理工作来大大缩小数据库的大小并加快查询速度,例如使用整数代替{{ 1}} junction table。 (整数比字符串占用更少的空间,并且比字符串更容易 lot ,因此您要尽可能多地使用它们来建立关系)

首先,在节点表的edges列中为rowid加上别名:

INTEGER PRIMARY KEY

(我假设名称是唯一的;否则,您将要进行适当的更改并在该列上添加一个普通索引(编辑:我怀疑您在CREATE TABLE nodes(id INTEGER PRIMARY KEY , name TEXT NOT NULL UNIQUE , address TEXT); INSERT INTO nodes(name, address) VALUES ('google', 'google.com') , ('MSN', 'microsoft.com'); -- etc. 上没有索引,将有助于解释一个非常慢的查询))。

然后使您的边表引用id列而不是名称一(也假设每个nodes.name对都是唯一的):

(source,dest)

({Documentation for WITHOUT ROWID,如果您从未见过。)

然后您问题中的查询将变为:

CREATE TABLE edges(source INTEGER REFERENCES nodes(id)
                 , dest   INTEGER REFERENCES nodes(id)
                 , PRIMARY KEY(source, dest)) WITHOUT ROWID;
INSERT INTO edges(source, dest) VALUES
  ((SELECT id FROM nodes WHERE name='MSN'), (SELECT id FROM nodes WHERE name='google'))
, ((SELECT id FROM nodes WHERE name='google'), (SELECT id FROM nodes WHERE name='MSN'));
-- etc.