最近在做一个用Java实现一个简易的搜索引擎项目时,由于数据量很大,需要分表。这里的分表指的水平分表。数据大概有几千万行了吧。
当数据量特别大的时候,查询速度特别慢,为了加快查询速度,只能采用分表的策略。除了水平切分还有垂直切分,用的不多。
当数据库分表后,为了方便操作数据库,我们可以采用Sharding-jdbc
。你可以把它理解为加强版的JDBC
。
当我们需要使用Shard-jdbc
,首先我们需要导入pom
坐标
1 | <dependency> |
我这里使用的4.0
版本
然后配置如下
1 | spring: |
说明一下,这是数据库里面的表。
我们可以看到 data_seg_relation
被分成了100个表,从data_seg_relation_0
到data_seg_relation_99

表结构

1 | algorithm-expression: data_seg_relation_$->{seg_id % 100} #如何映射到表 |
这个配置的意思是,当你查询的时候,比如 select * from data_seg_relation where seg_id=1165136
,
Shard-jdbc
会根据seg_id
这个取值,seg_id % 100 = 36
。然后它实际就会去查data_seg_relation_36
这个表。
当你配置好之后,你就可以像没有分表那样来去操作数据库。
但需要注意的是【踩的几个坑吧】:
如果你的
Java
是jdk8
以上的版本,或许你会报这样的错:Cause: javax.xml.bind.JAXBException: Implementation of JAXB-API has not been found on module path or classpath.
大概率就是你
jdk
版本的原因,要么你回退到jdk8
版本,要么你就添加如下pom
坐标。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.activation/activation -->
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.glassfish.jaxb/jaxb-runtime -->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.0-b170127.1453</version>
</dependency>当你用使用mybatis或mybatis-plus时,就不需要再配置它们的数据源了。
你当你写
SQL
时,最好别用子查询,因为你可能会报错的,【错误信息找不到ಥ_ಥ】解决方法就是不用子查询,一条
SQL
语句拆成两条不就好了!
__END__