分库分表

383 阅读2分钟

微信入群一块学习技术:Day9884125

什么是分库分表

   分库: 就是将一个数据库分成多个数据库,部署到不同的服务器上
   分表: 就是将一个数据库表分成多个表,部署到不同的服务器上

为什么需要分库分表

   业务量的剧增,数据库就会出现性能的瓶颈,这时候我们酒的考虑分库分表

分库原因

磁盘存储
   mysql单机磁盘容量会撑爆,这时候可以拆成多个数据库,磁盘使用率就会降低
并发连接支撑
   数据库的连接是有限的。在高并发的场景下,大量请求访问数据库。

分表的原因

   数据量太大,sql的查询会变慢,如果一张表查询sql没命中索引,千百万级别的表可能会拖垮整个数据库。
   即使sql命中索引,如果表的数据量超过一千万,查询也会变慢。这是因为索引一般是B+树结构,数量量太大,树的高度就会增高,查询就会变高。

分库分表导致的问题

事务问题

   分库分表后,假设两个表在不同的数据库,那么本地事务就会无效,需要使用分布式事务了。

跨库关联

   跨节点Join的问题。解决这种问题,可以分两次查询;或者把两张表的数据合到一张表里,join就又可以使用了。

排序问题

   跨节点的count、order by、group by以及聚合函数等问题。可以分别在各个节点上得到结果后在应用程序端进行合并处理。

分页问题

   1、在各节点查到对应结果后,在代码端汇聚再分页
   2、把分页交给前端,前端传来pageSize和pageNo,在各个数据库节点都执行分页,然后汇聚总数量前端。这样缺点就会造成空查,如果分页需要进行排序,也不好搞。

主键id

   数据库被切分之后,不能再依赖数据库自身的主键生成机制,可以考虑uuid,或者雪花算法。