【问题标题】:selecting SUM from large table efficiency从大表效率中选择 SUM
【发布时间】:2016-09-30 21:45:26
【问题描述】:

表结构:

db_table

id(int)、type(string)、value(decimal)、filter(json编码字符串)、time(int)

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

假设我想知道两个日期之间客户 100 的订单销售额。我的表格可能如下所示:

1 , 订单 , 100.00 , {"user":100}, 1464782400

2 , 订单 , 500.00 , {"user":100}, 1464782700

3 , 订单 , 200.00 , {"user":200}, 1464782100

4 , 订单 , 600.00 , {"user":100}, 1464782200

5 , 订单 , 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 秒,并且需要比这快得多。

【问题讨论】:

    标签: mysql performance sum range


    【解决方案1】:
    INDEX(type, filter, time),
    INDEX(type, time)
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-09
      • 2011-11-07
      • 2012-04-04
      相关资源
      最近更新 更多