加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

SQLite选择查询性能调优

发布时间:2020-12-12 23:43:59 所属栏目:百科 来源:网络整理
导读:我有以下查询,它只从一个表中获取数据. 编辑: 它是一个应该返回自动完成功能数据的查询. 自动填充数据可以是text1或text2. 完全匹配应该在顶部. int3是整数权重值,其中结果的顺序基于此.前两个查询用于识别完全匹配. 接下来的两个查询用于识别近匹配.在哪里
我有以下查询,它只从一个表中获取数据.

编辑:
它是一个应该返回自动完成功能数据的查询.

>自动填充数据可以是text1或text2.
>完全匹配应该在顶部. int3是整数权重值,其中结果的顺序基于此.前两个查询用于识别完全匹配.
>接下来的两个查询用于识别近匹配.在哪里text1> ‘foo’和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,MAX(int3) as int3 
   FROM mytable 
   WHERE text1 > 'foo' AND text1 < 'fop' AND Count < 4 
   GROUP BY Key 

UNION SELECT text2 as Key,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 optimization.

有关如何构造索引的说明,请参阅Query Planning.您的两个索引似乎是最佳的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读