Performance sqlite中非常慢的多表联接

Performance sqlite中非常慢的多表联接,performance,sqlite,Performance,Sqlite,我不清楚为什么这是一个如此缓慢的查询: SELECT count(*) FROM PanelsMeta INNER JOIN Publishers ON PanelsMeta.publisherid = Publishers.id INNER JOIN Geographies ON Geographies.geo = Publishers.geo; 使用查询分析器,我看到查询被索引: QUERY PLAN |--SCAN TABLE PanelsMeta USING COVERING INDE

我不清楚为什么这是一个如此缓慢的查询:

SELECT count(*) FROM PanelsMeta
INNER JOIN Publishers ON PanelsMeta.publisherid = Publishers.id
INNER JOIN Geographies ON Geographies.geo = Publishers.geo;
使用查询分析器,我看到查询被索引:

QUERY PLAN
|--SCAN TABLE PanelsMeta USING COVERING INDEX PanPubId
|--SEARCH TABLE Publishers USING INTEGER PRIMARY KEY (rowid=?)
`--SEARCH TABLE Geographies USING COVERING INDEX geos (geo=?)
表的大小如下:

sqlite> select count(*) from Publishers;
55
sqlite> select count(*) from PanelsMeta;
2948875
sqlite> select count(*) from Geographies;
37323
我做错了什么

我尝试的变体会产生相同的查询计划,而且速度也慢了几十分钟:

SELECT count(*) FROM Geographies
LEFT JOIN Publishers ON Publishers.geo = Geographies.geo 
LEFT JOIN PanelsMeta ON PanelsMeta.publisherid = Publishers.id;

# QUERY PLAN
# |--SCAN TABLE Geographies USING COVERING INDEX geos
# |--SEARCH TABLE Publishers USING COVERING INDEX PubGeo (geo=?)
# `--SEARCH TABLE PanelsMeta USING COVERING INDEX PanPubId (publisherid=?)

SELECT count(*) FROM Publishers
LEFT JOIN PanelsMeta ON PanelsMeta.publisherid = Publishers.id
LEFT JOIN Geographies ON Geographies.geo = Publishers.geo;

# QUERY PLAN
# |--SCAN TABLE Publishers USING COVERING INDEX PubGeo
# |--SEARCH TABLE PanelsMeta USING COVERING INDEX PanPubId (publisherid=?)
# `--SEARCH TABLE Geographies USING COVERING INDEX geos (geo=?)
使现代化 架构信息如下:

CREATE TABLE PanelsMeta(
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  f1 TEXT, 
  f2 TEXT, 
  f3 TEXT, 
  f4 DATETIME,
  f5 DATETIME,
  f6 TEXT, 
  f7 TEXT,
  publisherid INTEGER,
  FOREIGN KEY(publisherid) REFERENCES Publishers(id) ON DELETE CASCADE ON UPDATE CASCADE
);

CREATE INDEX ids ON PanelsMeta (id);
CREATE INDEX pp1 ON PanelsMeta (publisherid);
CREATE INDEX pp2 ON PanelsMeta (f1);
CREATE INDEX pp3 ON PanelsMeta (f1,publisherid);


当我尝试内部连接6个表,每个表中有1-100行时,我也遇到了同样的问题。每个表只有一列

然而,我的完整数据集是18GB,大约1100万行


我解决了这个问题,将所有数据放在一个表中,然后使用where-in语句。这很奇怪,但它比几分钟快了约1秒

表格定义是什么?谢谢,@Shawn。添加。显示索引。谢谢,现在已更新。这些索引的名称与您显示的查询计划中使用的名称不同。。。如果在x,y,顺便说一句,在x列上没有索引,那么在x列上没有索引
CREATE TABLE Publishers(
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  geo TEXT,
  f3 TEXT NOT NULL, 
  f4 TEXT NOT NULL,
  f5 TEXT,
  f6 TEXT
);

CREATE INDEX zf3 ON Publishers (f3);
CREATE INDEX zgeo ON Publishers (Geo);
CREATE INDEX zf6 ON Publishers (f6);
CREATE INDEX zid ON Publishers (id);
CREATE INDEX zf3g ON Publishers (f3,geo);
CREATE INDEX zf3gf6 ON Publishers (f3,geo,f6);
CREATE TABLE Geographies(
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  geo TEXT NOT NULL,
  f3 TEXT NOT NULL,
  f4 TEXT,
  f5 DATETIME,
  f6 TEXT,
  f7 TEXT,
  f7 JSON DEFAULT '{}',
  f8 TEXT
);

CREATE INDEX g ON Geographies (geo);
CREATE INDEX gf3 ON Geographies (f3);