顺丰集团java实习生一面 · 深圳
面试时间是在6月11号下午两点半到三点,已经面过大半个月了,因为最近考试的原因,现在才在这里写下面经。接下来我就描述总结一下一面的过程:
- 自我介绍
- 项目介绍
- 聊一聊数据库的分库分表
- 二叉树排序
- 手写快速排序
- http协议的理解
面试官接入视频之后开场就说面试时间有限,能简答就简答。虽然开场就给我不是很多深入思考的时间,但是面试官人还是很不错的,在我回答的时候会提醒我概念上答的不完善的地方,告诉我别紧张。(哈哈,我真的有些紧张,原因后面讲)
面试过程相对短暂,一共二十多分钟,不到半小时,但是该问的面基本都覆盖到了。首先项目介绍,面试官对实验室横的向课题似乎比较感兴趣,除了了解之外还问了问有没有实现产品化。其他的数据库和计算机网络那里都是穿插着小知识点问的,比较友好,没有一个操作十连问问到底层具体。大体上我觉得二叉树排序那里答得不好,我对这个的理解仅仅停留在二叉树的遍历方式,一直在答这个,然是感觉面试官有些不满意,应该是我漏掉了重点,网上后来查二叉树查找过程才发现我跑题了。。因为关于二叉树的应用我准备的并不充分,算是相较薄弱的一环,如果深入问的话我可能就一时反应不上来。(人菜多读书)
最后讲一讲那天我的情况。我之前预约的科二考试是6月12号进行,但是6月11号那天我在考场模拟科二,从中午十二点到下午四点。。。之前收到面试短信是10号下午四点,那会刚刚把模拟时间定下来,这下时间算是冲突了,我不得不在模拟中途下车去到考务中心的食堂准备。(那个时段食堂比较安静,靠窗环境亮度还不错)时间真是太巧了,哈哈。。
知识点&
- 数据库分库分表
分库分表是为了解决由于数据量过大而导致数据库性能降低的问题,将原来独立的数据库拆分成若干数据库组成,将数据大表拆分成数据表组成,使得单一数据库、单一数据表的数据量变小,从而达到提升数据库性能的目的。
分库分表包括分库和分表两个部分,在生产中通常包括:垂直分库、水平分库、垂直分表、水平分表四种方式。
垂直拆分(缓解单集群压力)
- 垂直分表
基于字段进行分表,一般对表中字段数据较大,长度较长(text类型)的拆分到“扩展表”,或者根据访问字段的频率进行分表,对低频字段和高频字段进行分表。避免查询时数据量太大造成的跨页问题。
- 垂直分库
垂直分库针对的是一个系统中的不同业务进行拆分,比如用户、商品、订单各一个库。切分后要放在多个服务器上,而不是一个服务器。因为服务器在提供CURD服务的时候,需要访问的数据量过大,在没拆分之前都是在一个库上进行,因此每个表还是竞争同一个物理机的CPU、内存、网络IO、磁盘。这会让数据处理直接影响系统性能,部署在多个服务器上解决了单机资源问题。
- 解决业务层面耦合,业务清晰;
- 能对不同业务的数据进行分级管理、维护、监控、扩展等;
- 高并发场景下,垂直分库能够提升IO、数据库连接数
水平拆分
- 水平分表
与水平分库思路类似,水平分表操作数据表,把数据分到多套表中。在同一个数据库内,把同一个表的数据按一定规则拆到多个表中。
- 优化单一表数据过大而产生的性能问题;
- 避免IO争抢并减少锁表几率;
- 水平分库
对于电商应用场景,如果店铺数和每家店铺的商品数都较多,那么单表查询显然不可能运行在合理范围内。这时,就要使用水平分库。即:按照一定规则进行分库,以ID为例。如果店铺ID为奇数,则将此操作映射到product_singleDB中;如果店铺ID为偶数,则将次操作映射到product_doubleDB中。
当一个应用难以在用细粒度进行垂直切分,或切分后数据量巨大、存在单库读写这时候就需要进行水平分库。但由于同一个表被分配到不同的数据库中,数据库实例较多需要额外进行数据操作的路由工作,因此却又提升了系统的复杂度。
🔽 限于篇幅,下一篇继续
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!