ShardingJDBC分表说明

本文探讨了基于客户端和服务器端实现的分库分表策略,如Mycat和ShardingJDBC。当单表数据量超过500万行或2GB时,推荐进行分库分表。常见的分片策略包括取余、范围分片、日期和一致性哈希等。SpringBoot结合ShardingJDBC的简单实现包括配置数据源、分片规则和示例代码。通过调整配置,可以实现灵活的数据分片和高效查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
    }
}

6.调用测试即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值