表格结构:
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秒,并且需要远远快于此。
答案 0 :(得分:0)
INDEX(type, filter, time),
INDEX(type, time)
你说filter LIKE...
;一个简单的filter =...
会起作用吗?或者你有时会使用通配符?如果你不需要通配符,第一个索引是好的;如果你有通配符,第二个会更好
但真正的解决方案是避免运行查询。您的查询闻起来像数据仓库应用程序,并且您正在生成“报告”。为了提高效率,请构建并维护一个Summary table,其中包含type
,filter
的每个组合的小计,以及日期。然后对摘要表运行查询,总结小计。