sqlite:我可以/我应该索引动态生成的子查询吗?

时间:2011-03-04 23:47:59

标签: sql optimization indexing sqlite

在sqlite v3中工作,我有一个需要日历表的查询,主要是将每月账单扩展到每日账单。尽管我仔细添加了索引(并使用了EXPLAIN QUERY PLAN),但它仍然太慢,无法满足我的需求。

有问题的查询基本上是:

    SELECT stuff
      FROM (<subquery>) AS calendar
INNER JOIN ...
INNER JOIN ...
INNER JOIN ...
  GROUP BY calendar.date

其中<子查询>是一个漂亮的日历生成技巧,我选择了某个地方:

      SELECT DATE('#{start_time.to_s(:db)}', (d4.digit * 10000 + d3.digit * 1000 + d2.digit * 100 + d1.digit * 10 + d0.digit) || ' DAYS') AS date
      FROM digits AS d0
INNER JOIN digits AS d1
INNER JOIN digits AS d2
INNER JOIN digits AS d3
INNER JOIN digits AS d4
     WHERE (d4.digit * 10000 + d3.digit * 1000 + d2.digit * 100 + d1.digit * 10 + d0.digit) < #{ndays}
  ORDER BY date

(是的,数字表预先加载了数字0 ... 9.它如何真正起作用留给读者练习!)

我知道日历子查询很快(<50毫秒)。但是在重新阅读sqlite文档时,我理解外部查询中的GROUP BY calendar.date强制在calendar.date上生成索引。由于日历是动态生成的,因此未对其编制索引。

所以问题,总是问题:

  • calendar.date上缺少索引可能是性能损失的来源吗? (正如我所提到的,我在索引外部查询中使用的表时非常小心。)
  • 我是否会因为制作一张20年巨大的牌桌并将其编入索引而感到高兴?或者,还有更好的方法?
  • 我非常擅长让mysql运行良好。是否有我应该知道的sqlite优化技巧(或陷阱)?

... TIA

1 个答案:

答案 0 :(得分:1)

你知道什么真的漂亮吗?将重要的业务数据存储在表中。

Create a calendar table,将其编入索引,使用日期填充它,然后在查询中尝试 。您的日历表可能只需要一列日期。