1.什么是分库分表?
字面意思就是把原本存储于一个库的数据分块存储到多个库上,把原本存储于一个表的数据分块存储到多个表上。
2.为什么要分库分表?
数据库中的数据量不一定是可控的,如果未进行分库分表,随着时间和业务的发展,库中的表会越来越多,表中的数据量也会越来越大,相应的,数据操作,增删改查的开销也会越来越大;另外,由于无法进行分布式部署,而一台服务器的资源(CPU、内存、磁盘、IO等)是有限的,最终数据库所能承载的数据量、数据处理能力都将遭遇瓶颈。
3.分库分表有垂直切分和水平切分两种
垂直切分:即将表按照功能模块、关系密切程度划分出来,部署到不同的库上。
例如:建立定义数据库workDB、商品数据库goodsDB、用户数据库userDB、日志数据库logDB等,分别用于存储项目数据定义表、商品定义表、用户数据表、日志定义表等。
水平切分:当一个表中的数据量过大时,我们可以把该表的数据按照某种规则,例如userID散列进行划分,然后存储到多个结构相同的表,和不同的库上。
例如:userDB中的用户数据表中,userDB:part0DB、part1DB等,userTable:userTable0、userTable1等,然后将这些表按照一定的规则存储到多个userDB上。
4.用垂直切分还是水平切分呢?
如果数据库因为表太多而造成海量数据,并且项目的各项业务逻辑划分清晰、低耦合,那么规则简单明了、容易实施的垂直切分必是首选。
如果数据库中的表不多,但单表的数据量很大、或数据热度很高,就选择水平切分。
5.分库分表存在的问题
事务问题:由于数据存储到了不同的库上,数据库事务管理出现了困难。如果依赖数据库本身的分布式事务管理功能去执行事务,将付出高昂的性能代价;如果由应用程序去协助控制,形成程序逻辑上的事务,又会造成编程方面的负担。
跨库跨表的join问题:无法join位于不同分库的表,也无法join分表粒度不同的表,结果原本一次查询能够完成的业务,可能需要多次查询才能完成。
额外的数据管理负担和数据运算压力:数据的定位问题和数据的增删改查的重复执行问题,这些都可以通过应用程序解决,但会增加额外的运算逻辑。例如,对于一个记录用户成绩的用户数据表userTable,业务要求查出成绩最好的100位,在进行分表之前,只需一个order by语句就可以搞定,但是在进行分表之后,将需要n个order by语句,分别查出每一个分表的前100名用户数据,然后在对这些数据进行合并运算,才能得到结果。