带你整理面试中数据库分库分表的相关知识点
Posted 南淮北安
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了带你整理面试中数据库分库分表的相关知识点相关的知识,希望对你有一定的参考价值。
文章目录
一、为什么要进行数据库分库分表?
主要是为了提升数据库的性能,因为当数据库中的数据量达到1000w或者100G以后,由于查询维度比较多,此时像添加优化索引之类的操作对于数据库的性能提升很小,所系需要对其进行分库分表,目的就是减小数据库的负担,将数据分散到多个数据库中,提升性能。
分库分表有垂直切分和水平切分两种
二、垂直切分
垂直分库:将表按照功能模块、关系密切程度划分并部署到不同的库中。
例如,我们会创建定义数据库workDB、商品数据库payDB、用户数据库userDB、日志数据库logDB等,分别用于存储项目数据定义表、商品定义表、用户数据表、日志数据表等,如图7-6所示。
垂直分表:是基于数据库中的"列"进行,某个表字段较多,可以新建一张扩展表,将不经常用或字段长度较大的字段拆分出去到扩展表中。在字段很多的情况下(例如一个大表有100多个字段),通过"大表拆小表",更便于开发与维护,也能避免跨页问题,mysql底层是通过数据页存储的,一条记录占用空间过大会导致跨页,造成额外的性能开销。另外数据库以行为单位将数据加载到内存中,这样表中字段长度较短且访问频率较高,内存能加载更多的数据,命中率更高,减少了磁盘IO,从而提升了数据库性能。
优点:
1-解决业务系统层面的耦合,业务清晰
2-与微服务的治理类似,也能对不同业务的数据进行分级管理、维护、监控、扩展等
3-高并发场景下,垂直切分一定程度的提升IO、数据库连接数、单机硬件资源的瓶颈
缺点:
1-部分表无法join,只能通过接口聚合方式解决,提升了开发的复杂度
2-分布式事务处理复杂
3-依然存在单表数据量过大的问题(需要水平切分)
三、水平切分
分库分表:是根据表内数据内在的逻辑关系,将同一个表按不同的条件分散到多个数据库或多个表中,每个表中只包含一部分数据,从而使得单个表的数据量变小,达到分布式的效果。
库内分表:只解决了单一表数据量过大的问题,但没有将表分布到不同机器的库上,因此对于减轻MySQL数据库的压力来说,帮助不是很大,大家还是竞争同一个物理机的CPU、内存、网络IO,最好通过分库分表来解决。
优点:
不存在单库数据量过大、高并发的性能瓶颈,提升系统稳定性和负载能力
应用端改造较小,不需要拆分业务模块
缺点:
跨分片的事务一致性难以保证
跨库的join关联查询性能较差
数据多次扩展难度和维护量极大
水平切分的方法:
- 可以根据ID区间或者时间区间
- hash取模
以上是关于带你整理面试中数据库分库分表的相关知识点的主要内容,如果未能解决你的问题,请参考以下文章