当前位置:网站首页>The interviewer asked me how to divide the database and the table?Fortunately, I summed up a set of eight-part essays
The interviewer asked me how to divide the database and the table?Fortunately, I summed up a set of eight-part essays
2022-07-31 05:31:00 【Listen to the bell sound】

一个挺着啤酒肚,身穿格子衫,发际线严重后移的中年男子,手拿着保温杯,胳膊夹着MacBook向你走来,看样子是架构师级别.
面试开始,直入正题.
面试官:小伙子,看到你的简历上面写了项目中有对MySQL进行分库分表,为什么要进行分库分表?
我:不知道啊!谁知道老大咋想的,反正我来的时候就已经分好了.
面试官:嗯...,今天的面试就先到这吧,有后续面试会通知你,我送你下去.
小伙伴们有兴趣想了解更多相关学习资料请点赞收藏+评论转发+关注我之后私信我,注意回复【000】即可获取更多免费资料!
我:当MySQL单表数据量过大,比如超过5千万条的时候,读写性能变得很差.而且常规的优化手段已经不起作用了,比如:SQL调优、添加索引、主从复制、读写分离.这时候就需要用到MySQL终极优化方案 — 分库分表.
面试官:不错,我该怎么判断项目是需要分库还是要分表?是先分库还是先分表?
这谁能现场总结出来?别着急,等我看一眼一灯的八股文.
我:有了.
- 当数据库的QPS过高,数据库连接数不足的时候,就需要分库.
- 当单表数据量过大,读写性能较差,就需要分表.
- 当两者都有的时候,就需要分库分表.
至于先分库还是先分表?建议先分表,如果分表能解决问题,就不需要分库了,毕竟需要单独服务器资源,成本更高.
面试官:小伙子,总结的挺全.分库分表有哪些拆分方案呢?
我:分库分表有垂直拆分和水平拆分.垂直拆分又有垂直分库、垂直分表.

面试官:小伙子,有点东西.都知道分库分表好使,就没有什么缺点吗?
我:当然有,“所有命运馈赠的礼物,早已在暗中标好了价格.”分库分表带来了低耦合、高性能的优点,可是缺点却是一大堆.
垂直分库:
不同库多表之间无法join关联查询,只能通过接口聚合,复杂度直线上升. 横跨多个数据库导致无法使用本地事务,数据强一致性就别想了,只能引入更为复杂的分布式事务,勉强实现数据的最终一致性,可用性直线下降.
垂直分表:
本来一张表能查出来的数据,现在需要多张表join关联查询,这不瞎耽误事.
水平分表:
多张表关联查询时,无法实现分页、排序功能.
面试官:分库分表带来这么多问题,你没有没考虑过相应的解决方案?
我怎么可能没有解决方案,难道我提出问题给自己挖坑?
我:当然有考虑过,“有问题就会有答案”.
跨库查询问题:
采用字段冗余方案,比如订单表存储店铺ID、店铺名称,就不需要再查询商户数据库了. 不过这种方案要求冗余字段要很少变动,就算变动后,也能容忍返回旧数据.
多表分页查询问题:
这个处理起来就很需要技术含量了. 比如:订单表按照订单ID分片,(order_id % 128),分成了128张表. Leader看了说:每张表的数据量差不多,分的很均匀,以后不要再分了.
同一个用户的订单散落在不同的表,用户想查询自己的订单,根本无法做到分页查询.难道一次全部查询该用户的所有订单,然后做内存分页,多大的机器内存都让你搞挂.
想要实现用户订单分页查询,可以采用按照用户ID分片,(user_id % 128),这样同一个用户的订单只会存储在一张表中,咋分页展示都行.
没有完美的分片方案,如果商户想要分页查看自己店铺的订单怎么办?
那就把订单再冗余存储一份,按照店铺ID分片,(shop_id % 128).不过由于商户数量较少,可以搞个异步线程Synchronize to the merchant order shard table.
订单按照用户ID分片后,发生数据倾斜怎么办?
因为不同用户的订单量是不同的,一个爱好购物的小姐姐的订单量抵得上几十个老爷们.导致一张表数据几百条,另一张表数据量千万级,这该咋整?
做冷热数据分离,基础库只存储3个月内的订单,其他的移动到历史订单库.这个要跟产品商量好,3个月前的订单需要单独的查询页面.
跨库事务问题:
这个问题就更复杂了.

下一个订单需要调用多个服务,只能使用分布式事务. 分布式事务的实现非常复杂,常用的有以下几种解决方案:
二阶段提交
TCC
本地消息表
MQ事务消息
分布式事务中间件
面试官:准备的挺全啊.订单表分片后,肯定不能使用数据库自增主键做订单ID,因为无法全局唯一,有什么好的解决办法?
我:又问到我手心里面,我前两天刚看完一灯写的“雪花算法”,我现场手写订单ID的生成代码吧.
面试官:小伙子可以啊,下一面是HR面试,有薪资要求尽管提,你一定要来我们公司上班.
总结:
关于分库分表的所有知识点,虽然很多,但都已经总结在这张图上了.

小伙伴们有兴趣想了解更多相关学习资料请点赞收藏+评论转发+关注我之后私信我,注意回复【000】即可获取更多免费资料!
边栏推荐
- MySQL optimization slow log query
- Interview Redis High Reliability | Master-Slave Mode, Sentinel Mode, Cluster Cluster Mode
- numpy和pytorch中的元素拼接操作:stack,concatenat,cat
- 快速掌握并发编程 --- 基础篇
- Mysql——字符串函数
- MySQL优化:从十几秒优化到三百毫秒
- 2022-07-30:以下go语言代码输出什么?A:[]byte{} []byte;B:[]byte{} []uint8;C:[]uint8{} []byte;D:[]uin8{} []uint8。
- DVWA安装教程(懂你的不懂·详细)
- SQL injection of DVWA
- MySQL transaction isolation level, rounding
猜你喜欢

mysql uses on duplicate key update to update data in batches

分布式事务处理方案大 PK!

docker安装postgresSQL和设置自定义数据目录

MySQL开窗函数
【一起学Rust】Rust的Hello Rust详细解析

Centos7 install mysql5.7
【一起学Rust】Rust学习前准备——注释和格式化输出

DVWA installation tutorial (understand what you don't understand · in detail)

With MVC, why DDD?

MySQL transaction isolation level, rounding
随机推荐
110 MySQL interview questions and answers (continuously updated)
MySQL(更新中)
Unity Framework Design Series: How Unity Designs Network Frameworks
精解四大集合框架:List 核心知识总结
DVWA之SQL注入
分布式事务处理方案大 PK!
Minio upload file ssl certificate is not trusted
What are the advantages and disadvantages of Unity shader forge and the built-in shader graph?
对list集合进行分页,并将数据显示在页面中
为什么要用Flink,怎么入门使用Flink?
1. Get data - requests.get()
基于flask的三方登陆的流程
SQL语句中对时间字段进行区间查询
目标检测学习笔记
Lock wait timeout exceeded解决方案
Moment Pool Cloud quickly installs packages such as torch-sparse and torch-geometric
MySQL database installation (detailed)
Apache DButils使用注意事项--with modifiers “public“
[Introduction to MySQL 8 to Mastery] Basics - silent installation of MySQL on Linux system, cross-version upgrade
太厉害了,终于有人能把文件上传漏洞讲的明明白白了