从大表效率中选择SUM

时间:2016-09-30 21:45:27

标签: mysql performance sum range

表格结构:

db_table

id(int),type(string),value(decimal),filter(json encoded string),time(int)

其中type表示正在存储的度量标准的类型,filter表示与过滤或排序相关的任何键。

说我想知道两个日期之间客户100的订单销售情况。我的表可能如下所示:

1,订单,100.00,{“用户”:100},1464782400

2,订单,500.00,{“用户”:100},1464782700

3,订单,200.00,{“用户”:200},1464782100

4,订单,600.00,{“用户”:100},1464782200

5,order,400.00,{“user”:200},1464782900

这是我尝试的许多查询之一,对我的应用程序来说太慢了(该表有超过一百万行):

SELECT SUM(`value`) FROM `db_table` WHERE `time` BETWEEN 1464782100 AND 1464782900 AND `type` = 'order' AND `filter` LIKE '"user":200'

这不是削减它,有没有办法提高查询的效率?我最多只能查询每个查询0.5秒,并且需要远远快于此。

1 个答案:

答案 0 :(得分:0)

INDEX(type, filter, time),
INDEX(type, time)

你说filter LIKE...;一个简单的filter =...会起作用吗?或者你有时会使用通配符?如果你不需要通配符,第一个索引是好的;如果你有通配符,第二个会更好

但真正的解决方案是避免运行查询。您的查询闻起来像数据仓库应用程序,并且您正在生成“报告”。为了提高效率,请构建并维护一个Summary table,其中包含typefilter的每个组合的小计,以及日期。然后对摘要表运行查询,总结小计。