1)使用场景
对于Mysql主从复制实现读写分离来说,可以解决读的扩展性问题。但是写的话,面对庞大的数据量还是集中在Master上,并且Master挂载的slave不可能无限制多,因为slave依赖于Master的能力和负载的限制。因此需要对Master进行扩展来实现海量数据的需要。
2)分表
对于访问极为频繁,数据量又极大的表来说,最直接做的就是减少数据量的总条数,以便减少数据查询所需要的时间,可以对大数据表进行分表。
分表策略:用id来进行分表是最为常见的策略,因为大部分查询都要带上id,又不影响查询又能使得数据均衡的分布在各个表中。假设有一个订单表有1000w条数据,将该表分成16个表,将id%16进行存储,如果id不是数字可以先hash取值。拆分的记录根据取余的值进行存储,App应用根据取余的值进行表的访问。
3)分库
分表能解决数据量过大造成的查询效率低下的问题,但是无法有效提示数据的并发访问能力。将数据库拆分,提高数据库的写入能力就是所谓的分库。
与分表类似,分库策略可以通过对某一个字段如id进行取余操作,来对数据访问进行路由。如id=19,分成3个库,19%3=1,这时候就路由到第一个库。
4)sharding-jdbc 实现分库分表
sharding-jdbc 最先是当当网开源代码,后来被Apache集成。
sharding-jdbc能帮我们实现什么:
1,保证事务一致性(跨库)
2,支持分页查询(跨库)
3,只要重配数据源,其他代码不需要改动
pom.xml 模块,引入jar
1 <dependency> 2 <groupId>io.shardingjdbc</groupId> 3 <artifactId>sharding-jdbc-core</artifactId> 4 <version>2.0.3</version> 5 </dependency> 6 <dependency> 7 <groupId>com.alibaba</groupId> 8 <artifactId>druid</artifactId> 9 <version>1.1.3</version> 10 </dependency> 11 <dependency> 12 <groupId>commons-dbcp</groupId> 13 <artifactId>commons-dbcp</artifactId> 14 <version>1.4</version> 15 </dependency>
demo链接:
链接:https://pan.baidu.com/s/1DPArC6hz3PmnSmSKc9KhmQ
提取码:ads6