分库分表
分库分表是什么
为什么要分库分表?
分库分表的方式
垂直分表
按字段使用频率的高低来拆分表, 频率高的字段放入同一张表, 频率低的字段放入另一张表.
优点
- 数据库以页为存储单位, 单页内数据行越多, 数据库性能越好
- 数据库以行为单位将数据加载到内存中
垂直分库
针对不同的业务, 将表进行分类, 不同类的表可以存放在不同的数据库上. 并且每个不同的数据库可以存放在不同的服务器上. ==核心理念是专库专用==.
优点
- 解决了业务层面上的耦合, 业务清晰
- 能够对不同业务的数据进行分级管理, 维护, 监控, 扩展等
- 高并发场景下, 垂直分库一定程度的提升了IO, 数据库连接数, 降低了单机硬件资源的瓶颈
水平分表
把同一个表的数据按照一定的规则拆分到不同的表中
- id范围(0->1000, 1000->2000)
- id取模
水平分库
分库分表带来的问题
分布式事务问题
分库分表将数据存储在不同数据库甚至不同服务器上, 因此会造成==分布式事务问题==.
(Sharding-JDBC不能解决分布式事务问题, 需要从其他方面考虑)
跨节点关联查询
不在同一个数据库, 甚至不在同一台服务器, 因此无法进行关联查询.
需要将原来的关联查询分为两次查询
跨节点分页, 排序等
假设要取成绩最高的10条数据, 那么需要将每个数据库中成绩最高的10条数据查找出来, 然后在该结果集中再次查找.
主键避免重复
分库分表造成不同的表可以出现相同的主键, 但是这些表逻辑上属于同一张表, 不应该出现相同的主键.
公共表
不同的表都需要依赖这些公共表. 例如不同的应用程序有依赖于手机的位置访问权限, 例如高德地图, 百度地图, 美团外卖.
对分库分表数据库的操作Sharding-JDBC
Sharding-JDBC不是如何去进行分库分表的工具, 而是在已经进行了分库分表的数据库中进行处理的工具.
Sharding-JDBC的核心功能是数据分片和读写分离. Sharding-JDBC可以透明的访问. 程序员不需要关注数据的分布, 在使用上相当于一张无限大的单表.
==对于机器, 单表会造成性能瓶颈, 所以需要拆分, 即分库分表. 对于应用程序员, 不希望关注数据表的存储等细节, 希望看到的是一张无限大的表, 因此通过Sharding-JDBC来简化分库分表之后的数据库操作, 相当于封装了一层.==
Sharding-JDBC使用
快速入门案例
数据库准备, 创建表order_1, order_2
CREATE DATABASE `shardingjdbc`; CREATE TABLE `order_1` ( `order_id` bigint(20) NOT NULL COMMENT '订单id', `price` decimal(10, 2) not null comment '订单价格', `user_id` bigint(20) not null comment '用户id', `status` varchar(50) character set utf8 not null comment '订单状态', primary key (`order_id`) using btree ) character set utf8 row_format dynamic; CREATE TABLE `order_2` ( `order_id` bigint(20) NOT NULL COMMENT '订单id', `price` decimal(10, 2) not null comment '订单价格', `user_id` bigint(20) not null comment '用户id', `status` varchar(50) character set utf8 not null comment '订单状态', primary key (`order_id`) using btree ) character set utf8 row_format dynamic;
- 使用Sharding-JDBC对水平分表后的user表进行操作