今天面试的最后一道问题。
内容是做年度数据报表,千万级的数据量需要在屏幕上分页展示。目前问题是查询太慢该如何解决。 我的回答是加索引。结果面试官的回答是:“还是慢。”把我整懵不知道怎么回答了。解决查询慢的关键真的不是索引吗?…
在此求教万能的 V 友们 (:з」∠)
101
herozzm 2020-04-18 11:30:48 +08:00 via Android
换 es,游标查询,说索引的确实不妥,数据量大翻页会翻死
|
102
Tokin 2020-04-18 14:51:40 +08:00 1
这个当时在做一个项目数千万数据翻页的时候,当时越靠后的数据查询越慢,分表、加索引效果不佳,后来是通过 IN 查询解决的,效果可以说是立竿见影,原本最慢要几分钟查出来,后来改完基本就瞬间出结果了。
分页的话还是慎用 limit |
103
lucky215 2020-04-18 15:31:20 +08:00
这个要看需求到什么程度,如果真有可以离线的数据那还好,mysql 把计算结果记录下来就行,但是如果数据是要实时聚合计算的,可能还是上 es 比较好些,缓存和索引的优化成本会比较高
|
105
popvlovs 2020-04-18 22:30:16 +08:00
这种深分页的问题 ES 也很难解,一般这种情况下都是要妥协的,比如限制只能够分页展示前 10000 条,要么就用 search_after 做成滚动加载的之类,实际上大部分场景下需要查询级千万条数据所在的分页根本就是个伪需求,根本不用费心考虑技术上的优化方案.....
|
106
Tokin 2020-04-18 23:38:29 +08:00
@aunox select * from table where `id` in (1,2,3);
这样,没用子查询,就代码生成一个 ID 数组,然后查出来就好了 |
107
yrj 2020-04-19 10:46:38 +08:00 via iPad
如果楼主亲自尝试过大数据分页,就不会只回答索引了。
|
109
Tokin 2020-04-19 19:48:35 +08:00
@nockyQ 就是索引、分表、缓存、部分业务可以 IN 查询。
而且有些业务年报是可以先每月生成当月的月报,到统计年报的时候把月报的数据统计成年报就好了。 |
110
947211232 2020-04-19 20:32:43 +08:00
没具体的,那方向可多了,0 、索引; 1 、缓存; 2 、分表; 3 、引擎、隔离级别; 4 、堆硬件; 5 、重启试一试 :)
|
111
realpg 2020-04-19 22:07:36 +08:00
|