外连接

时间:2015-07-21 01:24:08

标签: sql sqlite

我有一个SQLite数据库作为iOS应用程序的一部分,它在大多数情况下都可以正常工作,但对查询进行一些小的更改可能会导致完成时间缩短1000倍。这是我参与的两个表格:

create table "journey_item" ("id" SERIAL NOT NULL PRIMARY KEY,
"position" INTEGER NOT NULL,
"last_update" BIGINT NOT NULL,
"rank" DOUBLE PRECISION NOT NULL,
"skipped" BOOLEAN NOT NULL,
"item_id" INTEGER NOT NULL,
"journey_id" INTEGER NOT NULL);

create table "content_items" ("id" SERIAL NOT NULL PRIMARY KEY,
"full_id" VARCHAR(32) NOT NULL,
"title" VARCHAR(508),
"timestamp" BIGINT NOT NULL,
"item_size" INTEGER NOT NULL,
"http_link" VARCHAR(254),
"local_url" VARCHAR(254),
"creator_id" INTEGER NOT NULL,
"from_id" INTEGER,"location_id" INTEGER);

表包含主键和外键的索引。

以下是2个查询,它们提供了我的问题的一个很好的例子

SELECT * FROM content_items ci 
INNER JOIN journey_item ji ON ji.item_id = ci.id WHERE ji.journey_id = 1

SELECT * FROM content_items ci 
LEFT OUTER JOIN journey_item ji ON ji.item_id = ci.id WHERE ji.journey_id = 1

第一个查询需要167毫秒才能完成,而第二个查询需要3.5分钟而且我不知道为什么外部联接会产生如此巨大的差异。

编辑: 没有WHERE部分,第二个查询只需要267 ms

1 个答案:

答案 0 :(得分:2)

两个查询应该具有相同的结果集(where子句将left join转换为内连接)`。但是,SQLite可能不会认识到这一点。

如果您在journey_item(journey_id, item_id)上有索引,那么这将用于inner join版本。但是,第二个版本可能正在扫描第一个表以进行连接。 journey_item(item_id)上的索引会有所帮助,但可能仍然与第一个查询的性能不匹配。