
innodb,20 来个字段,每天有几十万条数据插入,在不做分表的情况下,怎么优化查询?现在是 count 查询很慢,5s 左右,带上查询条件比如近一个月就更慢了 10 多 s
1 Joyboo Sep 29, 2020 分区,索引 |
2 G2bN4dbX9J3ncp0r Sep 29, 2020 可以不做 count,就不做 非做的话,看看能不能自己统计 或者放 es 里? |
4 CodeXx OP @lidashuang 分页查询用到的,也不知道会用什么条件查询 |
5 huntcool001 Sep 29, 2020 每天晚上把到零点的数据库的数据,离线做分析统计,count+各种查询条件等等(大概 es 或者其他框架,我不是很清楚), 结果存起来. 然后每天的数据,你有了当天零点以来的 binlog,就有了增量的 count. 和离线分析做出来的 count 结合起来. 大概是这个思路. 大厂都是这么干的. |
6 RickyC Sep 29, 2020 如果数据库不经常改变 根据查询条件建立几个 count 表, 里面保存根据各种条件得到的 count 数字; 并给 count 表建立索引 这样也许行 |
7 RickyC Sep 29, 2020 接上 如果你每天还有 10w 的数据更改, 可以在每次更改的时候修改 count 表. 我觉得用 count 表可能解决你的问题. 预先统计 |
8 egglin Sep 29, 2020 异构吧,es + mysql |
9 maigebaoer Sep 29, 2020 via Android 如果直接 count,用 count(*)吧,没啥特别好的建议。要不就直接入库前统计,写 count 字段。 |
10 mrhhsg Sep 29, 2020 三千万的 count 那还不是一瞬间的事?加内存就完了 |
11 v2orz Sep 29, 2020 插入的时候维护 count 信息?同 9L |
12 Leigg Sep 29, 2020 via Android 不要做实时查询即可,延迟个 30s 几分钟,数量到达一定高度后,多数场景中的实时统计就变成了一种伪需求,如果一定需要,换数据库,比如 clickhouse |
13 RangerWolf Sep 29, 2020 12 楼+1,clickhouse 的统计非常 |
14 dongisking Sep 29, 2020 这问题我这边也遇到过,特别是做管理后台特别多复杂的条件做 where 的 count 根本无法缓存,最后的解决办法是把 count 缓存,然后页面显示“大约 xx 条”,每一段时间更新一次 |
15 cccy0 Sep 29, 2020 近实时统计的话建议放 es |
17 liuzhaowei55 Sep 29, 2020 via Android 不要使用 count,如果是 id 自增而且没有删除数据可以使用最后一条数据的 id,或者使用 explain 返回的 rows,这个值不太准但响应很快 |
18 nomansky Sep 29, 2020 加个表,里面保存 count,每插入一条数据更新 count |
19 haohappy Sep 29, 2020 count 慢 select 不慢吗 |
21 juntao Sep 29, 2020 最近有遇到,多字段 WHERE 查询,1kw 条不到,不想分表 1 做好索引。可以用 EXPLAIN 来帮助优化。 -- 有一定效果 2 限制查询的时间范围 -- 特别有效 3 异构,mysql,redis 、elasticsearch 等等单独统计数据, 因为 2 能够满足我们的需求,所以没采用。 @liuzhaowei55 直接获取自增 id 也是一种方法诶。之前没考虑,需要匹配场景。 |
22 fuyufjh Sep 29, 2020 mysql 8.0 有 parallel query,能大幅提升这个场景 |
23 zakokun Sep 29, 2020 1. 索引对 count 有用 2. 几千万的表 count 需求来自哪里?为何要每天 count 3. 维护一个 count 表,插入数据的时候更新 count 表 4. ES |
24 hooopo Sep 29, 2020 via Android |
25 j747677392 Sep 29, 2020 如果都是日志型的数据(用于分析,没删改的话) 可以用 hdfs+imapla,支持 sql,几亿数据查询毫秒吧 |
26 wangyzj Sep 29, 2020 count 和索引没关系 es 是个选项 或者单独做个统计信息表 或者用 redis 来分页 |
27 CodeXx OP |
29 cokolin Sep 29, 2020 能否首先描述一下为何要 count,例如页面查询需要总量,还是什么需要 |
30 cokolin Sep 29, 2020 还有查询用到的字段是否是固定的,如果的固定的话,是否可以增加索引,看看 EXPLAIN 分析用到的索引是否正确 另外也可以用一些业务的方式避免分页查询总量的 |
31 xsm1890 Sep 29, 2020 myisam 自动维护总数,count 的过程不用计算只需要度数即可 |
32 raysmond Sep 29, 2020 如果只是 count,且对实时性要求那么高(能接受 10s ?),有个很简单的做法能大幅提高速度 用一个线程异步 count 就好,用的地方直接从内存取,对使用方来说超级快 |
33 fangcan Sep 29, 2020 不要求精确的话 用 explain |
34 Evilk Sep 29, 2020 如果是分页用的 count,如果数据量太大,我一般给个模糊值 每隔段时间,更新一次,即可 |
35 liwl Sep 29, 2020 是想弄图表吧 每天 count |
36 rickiey Sep 29, 2020 mongoDB shared cluster 不行吗? 我没用过 |
37 lshero Sep 29, 2020 OLAP 的功能交给别的数据库做吧 |
38 mofeishiwo Sep 29, 2020 |
39 megatron7 Sep 29, 2020 没有数据断层吧并且有自增主键索引可以用: select max(id) from table; |
41 ragnaroks Sep 29, 2020 做个同步的从库,统计类需求从从库查,不影响主库业务 |
42 vus520 Sep 29, 2020 1,能不 count 就不 count 2,Mysql 有触发器,能不能插入的时候写到其它某个 value 上 3,缓存神器你值得拥有 |
43 liyunlong41 Sep 29, 2020 via iPhone 加索引应该也要扫描索引树吧。 插入的时候更新 count,似乎会影响插入效率。 将数据同步到其他数据库例如 es 或者从库,查询从这些里面查好像不错。 定时任务周期性的计算 count 也可以,查询时直接用结果,也是有一定的时延。 |
44 everhythm Sep 29, 2020 via iPhone 1.索引 or 各种缩小量级的方法对 count 有效,所以最近一个月的 count 你可以优化 2.来吧业务查询中间件,把 query 拆分为若干 subquery,再分发到不同实例,最后汇总,但是到这一步已经快超出 rds 范畴了,查询速度还不能接受的话考虑其他方式 |
45 G2bN4dbX9J3ncp0r Sep 29, 2020 @CodeXx 分页查询用 我之前都是去掉 count |
46 xuewuchen Sep 30, 2020 索引吧。。。LAST ID |