[英]SQLite Select Query Performance Tuning
我有以下查询,它只从一个表中获取数据。
编辑:这是一个应该返回自动完成功能数据的查询。
text1
或text2
。 int3
是整数权重值,其中结果的顺序基于此。 前两个查询用于识别完全匹配。 WHERE text1 > 'foo' AND text1 < 'fop'
短语实际上等于WHERE text1 LIKE 'foo%'
。 我这样写它是为了从索引中受益。 希望这可以帮助。
SELECT DISTINCT text1 as Key, 'text1' as Source, int1 as Count, 1000 as int3
FROM mytable
WHERE text1 = 'foo'
UNION SELECT DISTINCT text2 as Key, 'text2' as Source, int2 as Count, 1000 as int3
FROM mytable
WHERE text2 = 'foo'
UNION SELECT text1 as Key, 'text1' as Source, int1 as Count, MAX(int3) as int3
FROM mytable
WHERE text1 > 'foo' AND text1 < 'fop' AND Count < 4
GROUP BY Key
UNION SELECT text2 as Key, 'text2' as Source, int2 as Count, MAX(int3) as int3
FROM mytable
WHERE text2 > 'foo' AND text2 < 'fop' AND Count < 4
GROUP BY Key
ORDER BY int3 DESC, Count, Key LIMIT 0, 15;
表结构是:
CREATE TABLE mytable (text1 TEXT, text2 TEXT,
int1 NUMERIC, int2 NUMERIC, int3 NUMERIC);
它工作正常,但我需要微调性能。 我尝试了不同的索引选项,并使用内置计时器检查了性能结果。
我发现的最好的索引选项是:
CREATE INDEX cmp1 ON mytable (text1 ASC, int1 ASC, int3 DESC);
CREATE INDEX cmp2 ON mytable (text2 ASC, int2 ASC, int3 DESC);
如果你能告诉我任何更好的索引选项或更好的SQL查询,我将很高兴。
UNION
删除出现在两个子查询中的重复行,因此必须为结果创建临时表。
如果可以保证子查询是不同的,或者如果您不关心这些重复项,请改用UNION ALL
。
(在您的情况下,按非索引值int3
需要一个临时表。)
要优化子查询,请使用EXPLAIN QUERY PLAN
运行它们以检查它们是否使用索引。
如果确保正确声明索引,则可以使用LIKE
; 看LIKE
优化 。
有关如何构建索引的说明,请参阅查询计划 。 您的两个索引似乎是最佳的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.