抱歉只是清除我的问题。扩展此问题Optimizing sqlite query
我有一张桌子:
CREATE TABLE IF NOT EXISTS [app_status](
[id] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL ,
[status] TEXT DEFAULT NULL,
[type] INTEGER
)
我有两个索引。一个位于status
,另一个位于type
。哪个查询运行得更快,为什么?
SELECT COALESCE(min(type), 0)
FROM app_status
WHERE status IS NOT NULL
AND type IN (1,2) limit 1
QUERY PLAN o / p
0|0|0|SEARCH TABLE app_status USING INDEX idx_type (mailbox_type=?) (~10 rows)
0|0|0|EXECUTE LIST SUBQUERY 1
或者...
SELECT type FROM
app_status WHERE
status IS NOT NULL
ORDER BY type limit 1
QUERY PLAN o / p
0|0|0|SCAN TABLE app_status USING INDEX idx_type (~500000 rows)
答案 0 :(得分:2)
第一个查询以未指定的顺序返回与WHERE子句(where status is not null and type in (1,2)
)中的条件匹配的零行或一行。
第二个查询找到符合WHERE子句(where status is not null
)条件的所有行,按类型对它们进行排序,然后返回0或1行。
您应该注意,两个查询虽然可能返回相同的结果,但不保证。特别是,第二个查询返回的行将按type
的顺序返回结果集的第一行,而不管type
是什么值。如果`status为非null的type
的最低值是157,那就是你要获得的行。在这种情况下,第一个查询将返回0行。
但是假设type
和status
被索引并且查询可以使用一个或多个索引,那么我的怀疑是第一个查询会更快,因为它可以直接寻找到所需的行(或多个)。
但很大程度上取决于数据的形状(有多少数据?它是如何分配的?等等),无论索引是否为“覆盖”(如果索引不覆盖数据中的所有列)查询,然后它必须执行额外的I / O以获取覆盖所有列所需的数据页。
编辑注意查看您发布的执行计划(不知道Sqllite),第一个计划说应该返回大约10行;第二个约50,000行。您认为哪个更快?
答案 1 :(得分:2)
你应该:
CREATE INDEX idx_app_staus ON app_status (status, type)
通过这种方式,数据库angine不必查找所有行,它可以找到where子句所需的确切行。我'不知道哪个查询更快,因为他们没有返回相同的结果集但是从上面的索引所有这些类型的查询都会很快。另外两个索引可能会被删除。