2017-04-22 59 views
2

我有一個正常的SQLite數據庫表,名爲table1,有7列,當然還有一個rowid。第一列是一個custom_id號碼,第二列是格式爲YYYY-MM-DD的日期,其他5個是實數數據列。數據庫中有大約10M行,而custom_id和日期列有索引。如何加快日期GROUP BY的SQL查詢?

我想要做的是加快下面的查詢:

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

我想找到的最大正確(不是NAN)DATA1值的custom_id 1123年各月的組合。上面的代碼工作得很好,但查詢在第一次運行中持續10秒,但第二次運行時間在1秒以內,這對我來說沒問題。我使用PHP在我的家用PC Apache服務器上運行查詢。我認爲Apache使用一些緩存來解釋差異。

但問題是,如何加快第一次運行性能?我有很多其他的custom_id:s來查詢,並不是所有的都可以被緩存!我需要更多的索引嗎?另一種查詢?

+0

? –

+1

@GordonLinoff - 'date'(d-a-t-e)和'data1'(d-a-t-a),它是一個數值。 –

+0

@GordonLinoff我有日期和5個數據列data1,data2,data3,data4和data5。我是否必須爲每個數據列創建5個索引? table1(custom_id,data1),table1(custom_id,data2)...這將大大增加文件大小。目前文件大小約爲900兆字節。如果我不得不使用更多的索引,我不想超過2千兆字節。 – Laotse

回答

1

我們要創造條件,支持以下操作的指標:總每月

創建以下索引

    1. 檢索特定客戶的記錄是不可能的因爲strftime不是確定性函數

      create index table1_ix on table1 (custom_id,strftime('%Y-%m', date)); 
      

      non-deterministic functions prohibited in index expressions

      所以不是strftime('%Y-%m', date)我們要使用substr(date,1,7)

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

      爲什麼你`date`和`date1`查詢應相應改變

      select  substr(date,1,7), max(data1) as maximum 
      from  table1 
      where  custom_id = '1123' 
           and data1 <> 'NaN' 
      group by substr(date,1,7) 
      
  • +0

    我收到以下錯誤:SQLite3 :: query():'無法準備語句:11,畸形數據庫模式(table1_ix2) - 接近「(」:語法錯誤「但是,索引創建成功根據SQLitebrowser。 – Laotse

    +0

    爲什麼你想創建第一個索引?! –

    +0

    我很抱歉,我不明白你的意思是第一個索引。我運行這個'create index table1_ix on table1(custom_id,substr(日期,1,7));'和SQlitebrowser創建它。 – Laotse

    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)的索引。

    +0

    索引日期與此查詢無關 –