如何使用日期GROUP BY加速SQL查询?

时间:2017-04-22 18:41:12

标签: sql performance sqlite date indexing

我有一个普通的SQLite数据库表,名为table1,有7列,当然还有rowid。第一列是custom_id号,第二列是YYYY-MM-DD格式的日期,其他5是实数数据列。数据库中大约有10M行,custom_id和date列有索引。

我想要做的是加快以下查询:

SELECT date,max(data1) AS maximum
FROM table1
WHERE custom_id = '1123' AND data1 <> 'NaN'
GROUP BY strftime('%Y-%m', date)

我想为每个年 - 月组合找到custom_id 1123的最大正确(不是NaN)data1值。上面的代码实际上运行正常,但查询在第一次运行中持续10秒,但第二次运行时间不到1秒,这对我来说没问题。我用我的家用PC Apache服务器用PHP运行查询。我认为Apache使用了一些解释差异的缓存。

但问题是,如何加快第一次运行性能?我有很多其他的custom_id:s来查询,不是所有的都可以缓存!我需要更多指数吗?另一种查询?

2 个答案:

答案 0 :(得分:1)

我们将创建一个支持以下操作的索引:

  1. 检索特定客户的记录
  2. 按月汇总
  3. 由于.site-brand-inner { position:absolute; height:100%; width:100%; //remove this width display: table; } 不是确定性函数,因此无法创建以下索引

    strftime
      

    索引表达式中禁止的非确定性函数

    因此我们将使用create index table1_ix on table1 (custom_id,strftime('%Y-%m', date));

    代替strftime('%Y-%m', date)
    substr(date,1,7)

    应相应更改查询

    create index table1_ix on table1 (custom_id,substr(date,1,7));
    

答案 1 :(得分:0)

我猜这是你想要的:

SELECT strftime('%Y-%m', date), max(data1) AS maximum
FROM table1
WHERE custom_id = 1123 AND data <> 'NaN'
GROUP BY strftime('%Y-%m', date)

table1(custom_id, date)上的索引开始。