微信入群一块学习技术:Day9884125
什么是分库分表
分库: 就是将一个数据库分成多个数据库,部署到不同的服务器上
分表: 就是将一个数据库表分成多个表,部署到不同的服务器上
为什么需要分库分表
业务量的剧增,数据库就会出现性能的瓶颈,这时候我们酒的考虑分库分表
分库原因
磁盘存储
mysql单机磁盘容量会撑爆,这时候可以拆成多个数据库,磁盘使用率就会降低
并发连接支撑
数据库的连接是有限的。在高并发的场景下,大量请求访问数据库。
分表的原因
数据量太大,sql的查询会变慢,如果一张表查询sql没命中索引,千百万级别的表可能会拖垮整个数据库。
即使sql命中索引,如果表的数据量超过一千万,查询也会变慢。这是因为索引一般是B+树结构,数量量太大,树的高度就会增高,查询就会变高。
分库分表导致的问题
事务问题
分库分表后,假设两个表在不同的数据库,那么本地事务就会无效,需要使用分布式事务了。
跨库关联
跨节点Join的问题。解决这种问题,可以分两次查询;或者把两张表的数据合到一张表里,join就又可以使用了。
排序问题
跨节点的count、order by、group by以及聚合函数等问题。可以分别在各个节点上得到结果后在应用程序端进行合并处理。
分页问题
1、在各节点查到对应结果后,在代码端汇聚再分页
2、把分页交给前端,前端传来pageSize和pageNo,在各个数据库节点都执行分页,然后汇聚总数量前端。这样缺点就会造成空查,如果分页需要进行排序,也不好搞。
主键id
数据库被切分之后,不能再依赖数据库自身的主键生成机制,可以考虑uuid,或者雪花算法。