为了账号安全,请及时绑定邮箱和手机立即绑定

数据库之分库分表

标签:
PHP MySQL 设计

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名用户数据,然后在对这些数据进行合并运算,才能得到结果。


点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
PHP开发工程师
手记
粉丝
11
获赞与收藏
116

关注作者,订阅最新文章

阅读免费教程

感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消