单机数据库的存储容量,性能容量都是有极限的。即使顶配的服务器,单机情况下,业务量不断上涨的情况下,总会有到达极限的那一天。如果不能提前降低单机压力,把单机压力控制在合理范围内,那么最终的结果只能是数据库崩溃,服务无响应。
因此,分表的目的就在于此,减小数据库的负担,缩短查询时间。
另一方面,随着业务规模的扩大,业务复杂度的提高,团队分工的细化和调整。原来放在一起的数据已经不适合继续放在一起库或者表中,通过重构系统,将不同业务功能的数据,分布到不同的库中。可以优化业务线逻辑结构,优化团队组织机构。
mysql中有一种机制是表锁定和行锁定,是为了保证数据的完整性。表锁定表示你们都不能对这张表进行操作,必须等我对表操作完才行。行锁定也一样,别的sql必须等我对这条数据操作完了,才能对这条数据进行操作。
分库分表前常见面临的问题
用户请求量太大
因为单服务器TPS,内存,IO都是有限的。
解决方法:分散请求到多个服务器上; 其实用户请求和执行一个sql查询是本质是一样的,都是请求一个资源,只是用户请求还会经过网关,路由,http服务器等。
单库太大
单个数据库处理能力有限;单库所在服务器上磁盘空间不足;
单库上操作的IO瓶颈 解决方法:切分成更多更小的库
单表太大
CRUD都成问题;索引膨胀,查询超时
解决方法:切分成多个数据集更小的表。