面试最后一问把我整懵了

2020-04-17 12:15:46 +08:00
 nockyQ

今天面试的最后一道问题。

内容是做年度数据报表,千万级的数据量需要在屏幕上分页展示。目前问题是查询太慢该如何解决。 我的回答是加索引。结果面试官的回答是:“还是慢。”把我整懵不知道怎么回答了。解决查询慢的关键真的不是索引吗?…

在此求教万能的 V 友们 (:з」∠)

18644 次点击
所在节点    程序员
111 条回复
Airon
2020-04-17 17:37:51 +08:00
或者面试官只是想看看你解决问题的思路。
cs419
2020-04-17 17:46:01 +08:00
这类开放性的问题
回答的时候,需要自己加上限制条件不然没法答
你如果有相关经验,就把当时的场景方案讲一下

通常这类问题的解决方案都是折中的
比如上亿的数据 模糊搜索 那显然用 es 比 mysql 好 (不需要事务)
比如加载到特大内存,快速查询 (特有钱)
比如预先计算, 缓存预热
比如分表分库
具体问题具体分析
有相关经验还能问问是不是 xx 导致的,没经验只能干瞪眼

有些提问就纯属抬杠,
分库分表他说慢
说分布式集群 他说有可能全挂掉
异地多活 他都能说网线断了

你这问题就提供了两个点 慢 年度数据报表
报表一般来说 可以先算好的
慢 到底是慢在哪里
就是找痛点 找瓶颈
crazyneo
2020-04-17 17:47:19 +08:00
实际上这个问题是想问你怎么做数据库优化,只不过千万级单表的数据有点太 low 了……
一般来说有 3-4 层优化的空间,sql 语句与索引,表结构分析与视图建立,物理硬件与系统配置。
sql 语句与索引这点应该绝大多数人都会想到,常见分析工具是 explain/show processlist/slowlog/show session status 等等,一般优化思路包括执行计划优化 /索引建立 /长事务分析与优先级调整等等。
表结构分析与视图建立,如是否满足自增主键,能否提前建立物理视图来满足分页展示需求。
物理硬件与配置方面,更新硬件配置,建立连接池,是否要增加 swap,是否要调整引擎层刷盘策略,数据库配置参数如 mysql 中 innodb 的 buffer pool 配置 /查询缓存,或者 rocksdb 的 compact 策略等等。

如果放到更高一点层面来说,一般还会有下面几点。
1. 分布式 /分库分表与数据归总。
2. 缓存。
3. OLTP 与 OLAP 差异,列存数据库与行存选择。
miaoxinwei
2020-04-17 17:48:37 +08:00
考的就是分析问题的能力。。。
skaly
2020-04-17 17:49:33 +08:00
先搞清楚是返回数据慢,还是前端渲染慢啊?
hsuvee
2020-04-17 17:50:28 +08:00
1. 有序 id 分页 select * from aaa where id > 1000000 limit 100
2. 分表
3. es
skaly
2020-04-17 17:51:00 +08:00
返回数据慢 上面各位老哥已经说的差不多了
前端渲染慢 的话可以充钱换硬件了
louis2003
2020-04-17 18:06:32 +08:00
这个题目应该是数据大(一千万数据还好吧)分页的问题?
一般分页的话,就算是走索引数据量也是太大了,还是线性查找,然后再跳过过滤 mysql 的机制是这样的。
所以有很多直接基于 id 搜索先过滤再做分页的处理。
gemini767
2020-04-17 18:16:58 +08:00
olap 离线统计
drydiy
2020-04-17 18:19:30 +08:00
楼主你用鸟习惯要改改啊。
zhangsimon
2020-04-17 18:38:17 +08:00
我不会编程…
但看你题目描述我脑子里直接蹦出两个字“缓存”
zuoakang
2020-04-17 18:38:28 +08:00
redis 集群加 pika
ironMan1995
2020-04-17 18:39:55 +08:00
我前端,我想能不能将数据根据某种规则或者类型分类存在不同数据库或者什么东西中。然后同时查不同数据库然后聚合,这样会不会快一点
jswh
2020-04-17 18:48:51 +08:00
优化 sql,添加索引,冷热分离,添加缓存,分库分表,更换架构,数据库性能优化常规思路
最后一步:怼产品经理(这个功能实现不了)(手动狗头
BigR
2020-04-17 19:12:26 +08:00
@angryfish 正常的结果难道不是,一步步和面试官探讨,说出具体细节,解决这个问题,然后你就不用来上班了么。问题都解决了,你还来干嘛。
0x11901
2020-04-17 19:16:18 +08:00
我以为最后一问是:“你还有什么想要问我的?”
visitant
2020-04-17 19:21:39 +08:00
既然是报表,预生成一下?
veike
2020-04-17 21:14:27 +08:00
@optional id 如果不连续呢?
piao5109
2020-04-17 23:55:24 +08:00
开放式的问题

1 、硬件配置
2 、数据建模的时候 根据查询需求特点做优化
3 、合适的索引
4 、查询语句优化
5 、加缓存
6 、分表、分库、读写分离等
laminux29
2020-04-18 00:33:32 +08:00
这个问题的本质,其实是面试信息不对称的羞辱,而不是解决优化问题。

千万级数据,是个很有意思的数据量。往小的说,64 位 ID+64 位数据再加一个简单索引,撑死就几百 M 的非关系型内存数据。如果设计成流式统计或固定数组 + 矢量更改表,以内存高达 G 级与每秒海量 IOPS 的处理速度,查询与分页时间能在 ms 级完成。但如果往大的说,把满载撑死的单行平均数据,非顺序的链式(乱跳)结构,各种强关系的牵扯,各种触发器的拖累,加上数据存储在每秒 iops 低于 1k 的低速机械硬盘里,以及单次查询限定了非常小的内存空间,那么一次查询的排序 + 处理,能耗上两三小时也说不定。

这种情况下,面试官说不定早就针对他们自己的情况,给出了优化程度相当高的方案,然后在不告诉你完全信息的情况下,让你猜他们的场景与算法。他这种行为,面试很有可能已经不是他的唯一目的,说不定是他在同事面前故意刁难面试者,来哄抬他自身的技术价格。如果被面试者的级别越高,他就能越得逞。此时,就算你中了大奖,完整地猜出他们的场景,并给出了优于他的方案,说不定他也会一口否决你,然后说你的方法不行。

避免这种非对称羞辱的最佳方法,是你在面试前,针对他们产品的某种特性,给出更好的解决方案,并且提前做出性能对比测试并得出报表。此时,你完全可以不回答这个问题,然后直接扔出你的报表,说要不录用,要不你换公司,甚至换到竞品公司。当然,如果面试时,面试官很厚道,你可以保留这个行为。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/663387

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX