我有一张包含近300K记录的表格。我在索引列('type'被索引)上运行一个带有where子句的简单select语句:
SELECT *
FROM Asset_Spec
WHERE type = 'County'
该查询很快 - 大约1秒钟。另外,我想测试状态:
SELECT *
FROM Asset_Spec
WHERE type = 'County'
AND status = 'Active'
第二个非常慢(分钟)。状态未编入索引,在此特定情况下,数据库中99.9%的值为“活动”。
我有什么想法可以获得更好的表现?我们正在编译我们自己的SQLite版本,因此我可以调整许多设置(仅供参考 - 在iOS预装SQLite上的相同性能)
答案 0 :(得分:2)
我查看了查询计划,行数估计数量惊人。 Asset_Spec(~2行) - 实际行数几乎是300,000。 Ran'ALSIYZE' - 现在相同的查询在16ms内运行。
答案 1 :(得分:1)
我要尝试的第一件事是使用子查询
SELECT * FROM
(SELECT *
FROM Asset_Spec
WHERE type = 'County')
WHERE status = 'Active'
正如罗伯特建议的那样,在要过滤的任何列上添加索引是个好主意。我还会考虑将字段类型和状态更改为字符串以外的其他内容。
答案 2 :(得分:0)
您需要选择*?
的任何原因建议:
您需要检索多条记录吗?如果您只需要找到第一条记录,则在查询结尾添加“limit 1”。
如果您只是检查行是否存在,即您只需要知道有一行状态为活动,则“选择1”而不是“选择*”。