1.基于客户端和服务器端实现分库分表的区别
数据库中间件:mycat 或者 ShardingJDBC
基于服务器实现数据中间件(mycat) :
Mycat类似nginx
优点: 保证数据库的安全性,归并数据结果完全解耦 缺点:效率偏低
基于客户端方式实现数据库中间件(ShardingJDBC)
优点 : 效率比较高 缺点: 归并数据结果没有解耦,有可能会影响到我们业务逻辑
原理: 基于aop代理的方式拦截改写sql语句
2.单表达到多大量开始分表分库?
单表行数超过500万行或者单表容量超过2GB,才推荐进行分库分表,说明如果预计3年后的数据量
根本达不到这个级别,请不要再创建表时就分库分表
3.数据库分表分库策略有哪些?
1.取余/取模 均匀存放数据 缺点: 不能够扩容
2.按照范围分片 1-500万 501万-1000万
3.按照日期进行分片 日志 ,订单信息 ,统计
4.按照月份进行分片
5.按照枚举值分片 常量
6.二进制取模范围分片 类似HashMap 缺点 数据存放不均匀
7.一致性hash分片
8.按照目标字段前缀指定的进行分区
9.按照前缀ASCII码和值进行取模范围分片
4.主流分片算法?
取余/取模 日期 一致性hash分片
5.springboot整合shardingjdbc 简单实现分表
1.pom.xml
<dependency>
<groupId>io.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>io.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-namespace</artifactId>
<version>3.1.0</version>
</dependency>
2.数据库信息
3.配置文件
#===server 端口号配置===
server.port=8080
#数据源 库
# 库名
sharding.jdbc.datasource.names=test
sharding.jdbc.datasource.test.type=com.zaxxer.hikari.HikariDataSource
sharding.jdbc.datasource.test.driver-class-name=com.mysql.jdbc.Driver
sharding.jdbc.datasource.test.jdbc-url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&serverTimezone=Asia/Shanghai
sharding.jdbc.datasource.test.username=root
sharding.jdbc.datasource.test.password=root
# 需要分片的表名 mayikt_user
sharding.jdbc.config.sharding.tables.mayikt_user.actual-data-nodes=test.mayikt_user_$->{0..2}
# 分片主要取决于 id 字段
sharding.jdbc.config.sharding.tables.mayikt_user.table-strategy.inline.sharding-column=id
# 分片算法表达式 id取模
sharding.jdbc.config.sharding.tables.mayikt_user.table-strategy.inline.algorithm-expression=mayikt_user_$->{id % 3}
# 打印执行的数据库
sharding.jdbc.config.props.sql.show=true
# 打印执行的sql语句
spring.main.allow-bean-definition-overriding=true
#===mybatis 配置===
# 注意:一定要对应mapper映射xml文件的所在路径
mybatis.mapper-locations=classpath*:mapper/*.xml
# Mybatis SQL语句控制台打印
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
#开启驼峰命名 譬如数据库create_time 自动映射pojo属性createTime
mybatis.configuration.map-underscore-to-camel-case=true
4.基本类
@RestController
public class UserController {
@Autowired
private UserMapper userMapper;
@RequestMapping("/userList")
public List<User> userList(){
return userMapper.userList();
}
@RequestMapping("/insert")
public void insert(){
for (int i = 1; i < 16 ; i++) {
User user = new User(i,"张三"+i,i);
userMapper.insert(user);
}
}
@RequestMapping("/orderby")
public List<User> orderby(){
return userMapper.orderby();
}
@RequestMapping("/limit")
public List<User> limit(Integer start ,Integer end){
return userMapper.limit(start,end);
}
@RequestMapping("/findById")
public User findById(Integer id){
return userMapper.findById(id);
}
}
@Mapper
public interface UserMapper {
List<User> userList();
void insert(User user);
List<User> orderby();
List<User> limit(@Param("start") Integer start , @Param("end") Integer end);
User findById(@Param("id") Integer id);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zhzh.mapper.UserMapper">
<insert id="insert">
insert into mayikt_user values (#{id},#{name},#{age})
</insert>
<select id="userList" resultType="com.zhzh.model.User">
select * from mayikt_user
</select>
<select id="orderby" resultType="com.zhzh.model.User">
select * from mayikt_user order by age
</select>
<select id="limit" resultType="com.zhzh.model.User">
select * from mayikt_user limit #{start},#{end}
</select>
<select id="findById" resultType="com.zhzh.model.User">
select * from mayikt_user where id = #{id}
</select>
</mapper>
@Data
public class User implements Serializable {
private Integer id;
private String name;
private Integer age;
public User(Integer id, String name, Integer age) {
this.id = id;
this.name = name;
this.age = age;
}
}