关于数据库的学习,一个绕不过的东西就是数据库的分库分表,还是有必要总结一下,以后工作的时候会用到,面试的时候也会用到的。
1. 什么是数据库分表
关于分库分表字面理解就把原本存储在一个库一个表中的数据分储到多个表或者多个库上
2. 为什么要分库分表
数据库中的数据量不一定是可控的,随着时间和业务的发展,库中的表会越来越多,表中的数据量会越来越大,相应的,数据操作,增删改查的效率会降低、开销会越来越大,另外无法进行分布式部署,而一台服务器的资源是有限的,最终数据库所能承载的数据量、数据处理能力都将遇到瓶颈,通过分库分表可以针对性的解决一下瓶颈,但也是会遇到响应的一些问题。
3. 分库分表有哪些方式
1.垂直分表
垂直分表在日常开发和设计中比较常见,通俗的说法叫做“大表拆小表”,拆分是基于关系型数据库中的列进行的,通常情况某个表中字段较多,可以新建一张扩展表,将不经常用的或者长度较大的字段拆分出来放到“扩展表”中。
拆分字段的操作建议在数据库设计阶段就做好,如果发展过程中拆分,则需要改写以前的查询语句,会带来一定的成本和风险
2.垂直分库
垂直分库在“微服务”盛行的今天已经非常普及了,基本思路是按照业务模块划分不同的数据库,而不是像早起一样将所有的数据库表都放到同一个库中
3.水平分表
水平分表也称为横向分表,比较容易理解,就是将表中不同的数据按照一定规律分布到不通的数据库表中,这样来降低单表的数据量,优化查询性能,水平分表能降低单表数据量,一定程度上可以缓解查询性能的瓶颈,但本质上这些表保存在同一个库中,所以库级别还是会有io瓶颈
4.水平分库分表
水平分库分表与上面讲到的水平分表思路相同,唯一不同就是将这些拆分出来的表保存在不同的数据库中。
4. 分库分表有哪些问题
分库分表带来的性能优化非常客观,同时带来的问题也很有挑战,主要问题如下:
1.事务问题:
在执行分库分表之后,由于数据存储到了不同的库上,数据库事务管理出现了困难,如果依赖数据库本身的分布式事务管理功能去执行事务,将付出高昂的性能代价,如果由应用程序去协助控制,形成程序逻辑上的事务,又会造成编程方面的负担
2.跨库join问题:
在执行分库分表之后,难免会将原来逻辑性很强的数据划分到不通的表,不同的库上,这时,表的关联操作将收到限制,无法join操作,结果原来一次查询能够完成的业务,可能需要多次查询才能完成
3.额外的数据管理负担和数据运算压力:
额外的数据管理负担,最显而易见的就是数据定位问题和数据的增删改查的重复执行问题,这些都可以通过应用程序解决,但必然引起额外的逻辑运算