SQLite选择查询性能调优

时间:2012-09-26 19:12:01

标签: sql sqlite

我有以下查询,它只从一个表中获取数据。

修改 它是一个应该返回自动完成功能数据的查询。

  1. 自动填充数据可以位于text1text2
  2. 完全匹配应位于顶部。 int3是整数权重值,其中结果的顺序基于此。前两个查询用于识别完全匹配。
  3. 接下来的两个查询用于识别近匹配。 WHERE text1 > 'foo' AND text1 < 'fop'短语实际上等于WHERE text1 LIKE 'foo%'。我这样写是为了从索引中受益。
  4. 希望这有帮助。

    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查询,我将很高兴。

1 个答案:

答案 0 :(得分:4)

UNION删除两个子查询中出现的重复行,因此必须为结果创建临时表。

如果您可以保证子查询不同,或者您不关心这些重复项,请改用UNION ALL

(在您的情况下,按非索引值int3排序需要临时表。)


要优化子查询,请使用EXPLAIN QUERY PLAN运行它们以检查它们是否使用索引。

如果确保正确声明索引,则可以使用LIKE;见LIKE optimization

有关如何构建索引的说明,请参阅Query Planning。你的两个索引似乎是最优的。