当前位置: 首页 > 知识库问答 >
问题:

mysql sum多个字段千万级数据如何查询优化?

惠志
2024-02-29

统计数据表中多个sum千万级数据超时。由于业务需要实时 所以做不来快照表

image.png

我加了索引似乎也不管用

SELECT    f.*,    c.c_name,    u.username,    sum( f.dy_sc_num ) AS dy_sc_num_total,    sum( f.dy_gz_num ) AS dy_gz_num_total,    sum( f.dy_like_num ) AS dy_like_num_total,    sum( f.ks_gz_num ) AS ks_gz_num_total,    sum( f.ks_dz_num ) AS ks_dz_num_total,    sum( f.tt_gz_num ) AS tt_gz_num_total FROM    `f_like` AS f    LEFT JOIN f_company AS c ON c.id = f.company_id    LEFT JOIN system_user AS u ON u.id = f.user_id    where f.create_time >= '2024-02-27 00:00:00'    and f.create_time <= '2024-02-27 23:59:59'    GROUP BY f.user_id,f.device_id    ;

后来为了不联表 我直接把快照写入进去了

SELECT    f.*,        sum( f.dy_sc_num ) AS dy_sc_num_total,    sum( f.dy_gz_num ) AS dy_gz_num_total,    sum( f.dy_like_num ) AS dy_like_num_total,    sum( f.ks_gz_num ) AS ks_gz_num_total,    sum( f.ks_dz_num ) AS ks_dz_num_total,    sum( f.tt_gz_num ) AS tt_gz_num_total FROM    `f_like` AS f    where f.create_time >= '2024-02-27 00:00:00'    and f.create_time <= '2024-02-27 23:59:59'    GROUP BY f.user_id,f.device_id    ;

共有2个答案

游炳
2024-02-29

索引的存在是为了跳过不需要的记录,减少记录扫描数,所以对于任何全表操作都是无效的。因为既然你的 SQL 需要每条记录都参与计算,那么索引就没有意义。

如果你需要频繁的更新 sum,同时数据量极大,那么每次都扫描全部记录肯定是不现实的,就算你做了读写分离,只读库的负载依旧会非常高。所以优化思路有两个:

  1. 控制 SQL 的执行频率,让一个线程定时执行,并将结果放入缓存。好处是保持设计不过于复杂,缺点是在某种程度上牺牲了实时性;
  2. 将计算方式改为增量,例如把 sum 值放在缓存里,设计专门的逻辑来对其增量更新。好处是能做到实时,缺点是增加了复杂性。

另外,为什么你要一次查全部用户呢?如果一次只查询一个用户,那么就不会有这个问题。

汪深
2024-02-29

create_time 这个字段加一下索引

SELECT    f.user_id,    f.device_id,    c.c_name,    u.username,    SUM(f.dy_sc_num) AS dy_sc_num_total,    SUM(f.dy_gz_num) AS dy_gz_num_total,    SUM(f.dy_like_num) AS dy_like_num_total,    SUM(f.ks_gz_num) AS ks_gz_num_total,    SUM(f.ks_dz_num) AS ks_dz_num_total,    SUM(f.tt_gz_num) AS tt_gz_num_totalFROM    f_like AS f    LEFT JOIN f_company AS c ON c.id = f.company_id    LEFT JOIN system_user AS u ON u.id = f.user_idWHERE    f.create_time >= '2024-02-27 00:00:00'    AND f.create_time <= '2024-02-27 23:59:59'GROUP BY    f.user_id,    f.device_id,    c.c_name,    u.username
 类似资料:
  • 主要内容:前 言,主从复制的原理是什么?,主从复制的有几种模式?,主从延迟问题和常规解决方案,读写分离实战前 言 订单缓存方案上线之后,我们以为又开启了岁月安好的日子,但是,在一周后的某一天,DBA直接跑来了,DBA直接说:“leader让我直接找你,是这样的,上次加了缓存优化后,效果确实不错,但是我发现订单查询sql在今天的12:00至12:05之间有大量的慢sql,查询时间超过了2.5s。” 这个时候,我们立马开启了排查问题模式,首先,check了一下上次加的缓存,发现缓存正常,然后接着根据

  • 本文向大家介绍一千万条数据的表, 如何分页查询?相关面试题,主要包含被问及一千万条数据的表, 如何分页查询?时的应答技巧和注意事项,需要的朋友参考一下 数据量过大的情况下, limit offset分页会由于扫描数据太多而越往后查询越慢. 可以配合当前页最后一条ID进行查询, SELECT * FROM T WHERE id > #{ID} LIMIT #{LIMIT}. 当然, 这种情况下ID必

  • 问题内容: 我有以下查询: 分析表有6000万行,而交易表有3M行。 在此查询上运行时,我得到: 我已经不知道如何优化此查询了,因为它已经非常基础了。运行此查询大约需要70秒钟。 以下是存在的索引: 根据建议,在添加任何额外索引之前简化了两个表的架构,因为这并不能改善情况。 如果以上无法进一步优化。关于汇总表的任何实施建议都将非常有用。我们正在AWS上使用LAMP堆栈。上面的查询正在RDS(m1.

  • 需要使用到内存进行排序,但是短时间内排序又会导致内存益处

  • 本文向大家介绍MySQL百万级数据量分页查询方法及其优化建议,包括了MySQL百万级数据量分页查询方法及其优化建议的使用技巧和注意事项,需要的朋友参考一下 数据库SQL优化是老生常谈的问题,在面对百万级数据量的分页查询,又有什么好的优化建议呢?下面将列举了一些常用的方法,供大家参考学习! 方法1: 直接使用数据库提供的SQL语句 语句样式: MySQL中,可用如下方法: SELECT * FROM

  • 问题内容: 我正在尝试学习如何将软件包与go-sql-driver一起使用。我编写了以下简单程序,它可以工作,但是我无法弄清楚如何打印多个字段。 该数据库具有三个字段,和。我查询“ title1”,这是值之一,但我想打印“ title”和“ body”的值。我该怎么办? 问题答案: 要读取和而不是,请首先更改该语句。 更改 至 然后更改读数。更改 至 这将读取两个列。 要打印字段,您可以执行