湖北网站定制开发多少钱/结构优化设计

湖北网站定制开发多少钱,结构优化设计,中跃建设集团网站吗,做网站得每年续费吗在现代数据库设计中,随着数据量的不断增长,单一数据库往往无法满足高并发、高性能的业务需求。因此,分库分表策略成为数据库架构优化的重要手段。本文将介绍分库分表的基本概念,并重点探讨垂直拆分与水平拆分的区别,以…

在现代数据库设计中,随着数据量的不断增长,单一数据库往往无法满足高并发、高性能的业务需求。因此,分库分表策略成为数据库架构优化的重要手段。本文将介绍分库分表的基本概念,并重点探讨垂直拆分与水平拆分的区别,以及如何在 MyBatis-Plus 中结合 Sharding-JDBC 实现数据库的分库分表。

数据库分库分表概念

分库分表是数据库优化的一种常见方式,其核心目的是为了减少单库单表的数据压力,提高查询效率,同时提升数据库的可扩展性。

  • 分库(Database Sharding):将数据拆分存储到多个独立的数据库中。
  • 分表(Table Sharding):将一张大表拆分成多张小表,提高查询效率。

分库分表可以缓解单库承载的压力,并能提高数据库的可用性,但同时也会带来数据路由、事务一致性等挑战。

垂直拆分与水平拆分的区别

垂直拆分(Vertical Partitioning)

垂直拆分主要是按照业务功能或者数据表的字段进行拆分,通常有两种方式:

  1. 按业务拆分:不同的业务数据存储在不同的数据库中,例如用户数据存储在 user_db,订单数据存储在 order_db。
  2. 按字段拆分:将大表按照字段拆分成不同的表,例如 user 表可能包含大量不常用的扩展字段,可以拆分成 user_base(基础信息表)和 user_detail(扩展信息表)。

优点

  • 业务逻辑清晰,适用于不同业务模块的数据隔离。
  • 单表字段减少,提高查询效率。

缺点

  • 需要修改业务代码,跨库查询变得复杂。
  • 事务处理难度增加。

水平拆分(Horizontal Partitioning)

水平拆分是按照数据的范围进行拆分,将相同结构的数据分散存储到不同的数据库或表中,常见的拆分策略有:

  1. 按范围拆分(Range Sharding):例如按照用户 ID 进行范围分片,id 在 11000000 存储在 db_1,10000012000000 存储在 db_2。
  2. 按哈希拆分(Hash Sharding):通过哈希函数计算数据存储位置,例如 hash(user_id) % 4 来决定数据存储在哪个分库。

优点

  • 解决了单表数据量过大的问题,提高查询性能。
  • 单表数据量减少,提高索引查询效率。

缺点

  • 需要数据库代理或者中间件进行数据路由。
  • 分片后的数据管理变得复杂。

在 MyBatis-Plus 中实现分库分表

MyBatis-Plus 是基于 MyBatis 的增强框架,提供了更加方便的 CRUD 操作,而 Sharding-JDBC 则是用于分库分表的中间件。二者结合可以实现灵活的分库分表方案。

1. 引入依赖

<dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><version>4.1.1</version>
</dependency>

2. 配置数据源

spring:shardingsphere:datasource:names: db1,db2db1:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverjdbc-url: jdbc:mysql://localhost:3306/db1username: rootpassword: passworddb2:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverjdbc-url: jdbc:mysql://localhost:3306/db2username: rootpassword: passwordsharding:tables:user:actual-data-nodes: db$->{1..2}.user_$->{0..1}table-strategy:inline:sharding-column: idalgorithm-expression: user_$->{id % 2}key-generator:column: idtype: SNOWFLAKE

3. 配置 MyBatis-Plus

@Configuration
@MapperScan("com.example.mapper")
public class MyBatisPlusConfig {@Beanpublic PaginationInterceptor paginationInterceptor() {return new PaginationInterceptor();}
}

4. 编写 Mapper 接口

@Mapper
public interface UserMapper extends BaseMapper<User> {
}

5. 测试分库分表

public void testInsert()ublic void testInsert() {User user = new User();user.setId(1L);user.setName("Alice");userMapper.insert(user);}
}

范围查询的实现

在实际应用中,范围查询(如按时间或 ID 范围查询)是常见需求,Sharding-JDBC 提供了基于 SQL 解析的查询路由。

public void testRangeQuery() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.between("id", 1000, 2000);List<User> users = userMapper.selectList(queryWrapper);users.forEach(System.out::println);
}

底层原理

  1. SQL 解析:Sharding-JDBC 解析 BETWEEN 语句,识别分片键。
  2. 数据路由:计算查询的范围涉及哪些数据库或表。
  3. SQL 重写:将单一查询拆分为多个子查询,在多个分片表上执行。
  4. 数据合并:Sharding-JDBC 负责合并多个分片的查询结果,并返回统一的结果集。

总结

本文介绍了数据库分库分表的概念,并对比了垂直拆分与水平拆分的优缺点。在 MyBatis-Plus 中,可以通过 Sharding-JDBC 轻松实现分库分表,提高数据库的可扩展性和查询性能。此外,我们深入分析了 MyBatis-Plus 与 Sharding-JDBC 结合的底层执行逻辑,展示了 SQL 路由、改写及执行的完整过程,并补充了范围查询的实现方式及底层机制。在实际应用中,选择合适的拆分策略需要结合业务需求,确保数据分布均匀,并考虑事务一致性和查询优化等问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/71287.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3.1、密码学基础

目录 密码学概念与法律密码安全分析密码体制分类 - 私钥密码/对称密码体制密码体制分类 - 公钥密码/非对称密码体制密码体制分类 - 混合密码体制 密码学概念与法律 密码学主要是由密码编码以及密码分析两个部分组成&#xff0c;密码编码就是加密&#xff0c;密码分析就是把我们…

Unity 对象池技术

介绍 是什么&#xff1f; 在开始时初始化若干对象&#xff0c;将它们存到对象池中。需要使用的时候从对象池中取出&#xff0c;使用完后重新放回对象池中。 优点 可以避免频繁创建和销毁对象带来性能消耗。 适用场景 如果需要对某种对象进行频繁创建和销毁时&#xff0c;例…

Github 2025-03-03 开源项目周报Top14

根据Github Trendings的统计,本周(2025-03-03统计)共有14个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目5TypeScript项目4Jupyter Notebook项目3Go项目2JavaScript项目2C++项目2Vue项目1Rust项目1Dify.AI: 开源的LLM应用程序开发平台 创建…

阿里管理三板斧课程和管理工具包(视频精讲+工具文档).zip

阿里管理三板斧课程和管理工具包&#xff08;视频精讲工具文档&#xff09;&#xff0c;共18课。 阿里管理三板斧工具包 阿里绩效考核文档 阿里人力资源实践全集文档 阿里文化构建工具包 阿里正委体系工具包 阿里三板斧.pdf 阿里三板斧-学员手册.pdf 第1集 三板斧的底层逻辑.…

Java【多线程】(2)线程属性与线程安全

目录 1.前言 2.正文 2.1线程的进阶实现 2.2线程的核心属性 2.3线程安全 2.3.1线程安全问题的原因 2.3.2加锁和互斥 2.3.3可重入&#xff08;如何自己实现可重入锁&#xff09; 2.4.4死锁&#xff08;三种情况&#xff09; 2.4.4.1第一种情况 2.4.4.2第二种情况 2.4…

深入解析Java虚拟机(JVM)的核心组成

深入解析Java虚拟机&#xff08;JVM&#xff09;的核心组成 Java虚拟机&#xff08;JVM&#xff09;作为Java语言跨平台的核心实现&#xff0c;其架构设计精妙而复杂。理解JVM的组成部分&#xff0c;是掌握Java内存管理、性能调优和问题排查的关键。本文将从四大核心模块剖析J…

DeepSeek如何快速开发PDF转Word软件

一、引言 如今&#xff0c;在线工具的普及让PDF转Word成为了一个常见需求&#xff0c;常见的PDF转Word工具有收费的WPS&#xff0c;免费的有PDFGear&#xff0c;以及在线工具SmallPDF、iLovePDF、24PDF等。然而&#xff0c;大多数免费在线转换工具存在严重隐私风险——文件需上…

[KEIL]单片机技巧 01

1、查看外设寄存器的值 配合对应的芯片开发手册以查看寄存器及其每一位的意义&#xff0c;可以解决90%以上的单纯的片内外设bug&#xff0c;学会如何通过寄存器的值来排外设上的蛊是嵌入式开发从小白到入门的重要一步&#xff0c;一定要善于使用这个工具&#xff0c;而不是外设…

Redis详解(实战 + 面试)

目录 Redis 是单线程的&#xff01;为什么 Redis-Key(操作redis的key命令) String 扩展字符串操作命令 数字增长命令 字符串范围range命令 设置过期时间命令 批量设置值 string设置对象,但最好使用hash来存储对象 组合命令getset,先get然后在set Hash hash命令: h…

计算机视觉(opencv-python)入门之图像的读取,显示,与保存

在计算机视觉领域&#xff0c;Python的cv2库是一个不可或缺的工具&#xff0c;它提供了丰富的图像处理功能。作为OpenCV的Python接口&#xff0c;cv2使得图像处理的实现变得简单而高效。 示例图片 目录 opencv获取方式 图像基本知识 颜色空间 RGB HSV 图像格式 BMP格式 …

【SpringBoot】【log】 自定义logback日志配置

前言&#xff1a;默认情况下&#xff0c;SpringBoot内部使用logback作为系统日志实现的框架&#xff0c;将日志输出到控制台&#xff0c;不会写到日志文件。如果在application.properties或application.yml配置&#xff0c;这样只能配置简单的场景&#xff0c;保存路径、日志格…

在Docker中部署DataKit最佳实践

本文主要介绍如何在 Docker 中安装 DataKit。 配置和启动 DataKit 容器 登陆观测云平台&#xff0c;点击「集成」 -「DataKit」 - 「Docker」&#xff0c;然后拷贝第二步的启动命令&#xff0c;启动参数按实际情况配置。 拷贝启动命令&#xff1a; sudo docker run \--hostn…

React Native 原理

React Native 是一个跨平台移动应用开发框架&#xff0c;它允许开发者使用 JavaScript 和 React 来开发 iOS 和 Android 原生应用。React Native 的核心原理是通过 桥接&#xff08;Bridge&#xff09; 技术&#xff0c;使用 JavaScript 来控制原生组件&#xff0c;并将应用逻辑…

实验:k8s+keepalived+nginx+iptables

1、创建两个nginx的pod&#xff0c;app都是nginx nginx1 nginx2 2、创建两个的pod的service 3、配置两台keepalived的调度器和nginx七层反向代理&#xff0c;VIP设置192.168.254.110 keepalived调度器master keepalived调度器backup 两台调度器都配置nginx七层反向代理&#…

火山引擎 DeepSeek R1 API 使用小白教程

一、火山引擎 DeepSeek R1 API 申请 首先需要三个要素&#xff1a; 1&#xff09;API Key 2&#xff09;API 地址 3&#xff09;模型ID 1、首先打开火山引擎的 DeepSeek R1 模型页面 地址&#xff1a;账号登录-火山引擎 2、在页面右下角&#xff0c;找到【推理】按钮&#…

yolov8_pose模型,使用rknn在安卓RK3568上使用

最近在使用rknn的一些功能,看了看文档以及自己做的一些jni,使用上yolov8_pose的模型. 1.我们先下载一下rknn的模型功能代码,rk有自己做的一套demo 地址:GitHub - airockchip/rknn_model_zooContribute to airockchip/rknn_model_zoo development by creating an account on G…

计算机毕业设计Python+DeepSeek-R1大模型游戏推荐系统 Steam游戏推荐系统 游戏可视化 游戏数据分析(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

飞书考勤Excel导入到自己系统

此篇主要用于记录Excel一行中&#xff0c;单条数据的日期拿取&#xff0c;并判断上下班打卡情况。代码可能满足不了大部分需求&#xff0c;目前只够本公司用&#xff0c;如果需要&#xff0c;可以参考。 需要把飞书月度汇总的考勤表导入系统中可以参考下。 下图为需要获取的年…

【AIGC系列】5:视频生成模型数据处理和预训练流程介绍(Sora、MovieGen、HunyuanVideo)

AIGC系列博文&#xff1a; 【AIGC系列】1&#xff1a;自编码器&#xff08;AutoEncoder, AE&#xff09; 【AIGC系列】2&#xff1a;DALLE 2模型介绍&#xff08;内含扩散模型介绍&#xff09; 【AIGC系列】3&#xff1a;Stable Diffusion模型原理介绍 【AIGC系列】4&#xff1…

鸿蒙启动页开发

鸿蒙启动页开发 1.1 更改应用名称和图标 1.更改应用图标 找到moudle.json5文件&#xff0c;找到应用启动的EntryAbility下面的icon,将原来的图标改成自己设置的即可 2.更改应用名称 3.效果展示 2.1 广告页面开发 3.1 详细介绍 3.1.1 启动页面 import { PrivacyDialog } fr…