数据库的分库分表 详解

news2024/11/24 17:20:11

前言

一个系统随着用户量上升,产生的数据也越来越多,到达一定程度,数据库就会产生瓶颈。

首先单机数据库所能承载的连接数,io和吞吐量都是有限的,并发量上来数据库就渐渐顶不住了。

如果单表的数据量过大,查询的性能也会下降,B+Tree层数可能增加,io次数增加,原理可以看我以前的文章。

此时就不得不分库分表。

分库

把以前存在一个数据库实例的数据拆分成多个数据库实例,部署在不同的服务器中。

分表

把以前存在一张表里的数据拆分成多张表。

字面的意思理解:分库就是把原在一个库的数据查分成不同的库,部署在不同的服务器,分表就是把表拆分成多个表,表还在一个库中。

解决的问题

分表:为了解决由于单表数据量大,从而导致查询慢的问题。三、四千万行数据就得拆分

分库:为了解决服务器资源受单机限制,顶不住高并发访问的问题,把请求分配到多台服务器上,降低服务器的压力。

怎么进行分库、分库的例子

一般分库都是按照业务划分的,比如订单表、用户表等

因为做活动的时候并发量会很高,怕影响现有的核心业务,所以及时有关联,也会单独做拆分。

分库带来的问题

事务问题

关系型数据库的优势就是他能保证事务的完整性

分库之后单机事务就用不上了,必须使用分布式事务来解决,而分布式事务基本都是残缺的。

join问题

在一个库中的表我们可以join进行表连接,跨库之后就无法join了。

解决方法1就是在业务代码中进行关联(原先是在数据库中进行关联,现在是在业务代码中进行关联),也就是先查出一个表,之后通过得到的结果再去查另一个表。利用代码来关联最终得到的结果。

解决方法2就是适当的冗余一些字段。

怎么进行分表、分表的方式

分表分为两种

垂直分表

垂直分表就是把一些不常用的大字段分离出去

就像上面的例子,用户名是很常用的搜索字段,性别年龄占用的空间不大,但是地址和个人简介占用的空间很大,我们都知道数据页是有限的,一行记录越大一个数据页存的及记录越少。把一些无用的大字段分离出来,一页就能放很多数据。内存就能存放更多有用的数据,减少了io,性能就得到提升。

水平分表

水平分表是因为一张表的数据太多,导致B+Tree高了,性能就差,所以进行水平拆分。

分表产生的问题

垂直分表还好,查询数据就是需要关联一下,而水平分表就麻烦了,排序,count,分页都会产生问题 。

        数据如果拆分成多个表,那查询结果分页就不像以前单张表那样直接就能查出来,像count操作也是一样的。只能由业务代码来实现。当然像count操作的结果其实可以缓存下来,然后每次数据的增删都更新计数。

路由问题(查找数据)

分表可以分为:

Hash路由:选择表中的某一列,然后进行hash运算,将hash运算得到的结果在对子表进行取模,这样就能均匀的将数据分到不同的子表上。和HashMap选择桶的原理相同。

优点:数据分布均匀

缺点:迁移数据很麻烦

范围路由(其实和分区的实现挺像的,但是分区和分表有本质的区别)

可以是时间也可以是地址,表示一定范围的即可。

比如本来一张 User 表,按照地名来划分 User。

再比如 log 表,我可以将表分为 一个一个时间的表,把日志按照年月来划分。

优点就是相对而言比较容易扩展,比如现在来个 GZ,那就加个 User_GZ。如果到了 5 月,那就建个五月的表。

缺点就是数据可能分布不均匀,例如 BJ 的用户特别多或者某个月搞了促销,日志量特别大,等等。

路由表

 从这张表我们就知道用户对应的表,查到该用户就去对应的表中找他的信息。

优点:灵活,如果要迁移数据,直接迁移之后改路由表就行

缺点:就是多了一次查询,每次都得访问路由表,一般会做缓存

全局主键问题

单表的时候主键自增,主键不会重复,那分表之后怎么办,注意这是水平分表会产生的问题。

怎么保证全局主键的唯一性

1、自增,设置自增步长,比如有三张表,不长为几都行,三张表初始值分别为1、2、3,这样自增后都不会相同不会重复。

2、UUID,肯定不会重复,但是因为主键不是自增的可能会产生页分裂。

 

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

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

相关文章

腾讯云新用户优惠活动有哪些可以参加?腾讯云新人服务器优惠活动

腾讯云作为国内领先的云服务提供商,不仅为用户提供稳定可靠的云服务器,还为新用户带来了一系列的优惠活动和代金券,以降低购买成本,提高业务效益。在这里,我们将为您详细介绍腾讯云服务器的新人优惠活动及代金券&#…

JavaEE——简单认识HTML

文章目录 一、简单解释 HTML二、认识 HTML 的结构三、了解HTML中的相关标签1.注释标签2.标题标签3.段落标签 p4. 换行标签 br5.格式化标签6.图片标签解释 src解释 alt解释其他有关 img 标签的属性 7.超链接标签 a8.表格标签9.列表标签10.input 标签11. select 下拉菜单以及 div…

Flink1.17 DataStream API

目录 一.执行环境(Execution Environment) 1.1 创建执行环境 1.2 执行模式 1.3 触发程序执行 二.源算子(Source) 2.1 从集合中读取数据 2.2 从文件读取数据 2.3 从 RabbitMQ 中读取数据 2.4 从数据生成器读取数据 2.5 …

Vue3 toRef函数和toRefs函数

当我们在setup 中的以读取对象属性单独交出去时,我们会发现这样会丢失响应式: setup() {let person reactive({name: "张三",age: 18,job: {type: "前端",salary:10}})return {name: person.name,age: person.age,type: person.jo…

​软考-高级-系统架构设计师教程(清华第2版)【第17章 通信系统架构设计理论与实践(P614~646)-思维导图】​

软考-高级-系统架构设计师教程(清华第2版)【第17章 通信系统架构设计理论与实践(P614~646)-思维导图】 课本里章节里所有蓝色字体的思维导图

Egress Gateway

目录 文章目录 目录本节实战Egress Gateway访问外部服务1.Envoy 转发流量到外部服务2.控制对外部服务的访问3.直接访问外部服务总结 Egress 出口网关1.用 Egress gateway 发起 HTTP 请求2.用 Egress gateway 发起 HTTPS 请求 关于我最后 本节实战 实战名称🚩 实战&…

MAXScript实现简单的碰撞检测教程

在本教程中,我们将创建一个使轮子在地形上跟随的脚本。此脚本将没有任何UI。并且仅适用于特定对象。 因此,第一步是创建一个新的脚本。打开侦听器窗口,然后在文件菜单下选择“新建脚本…”。 我们首先需要创建与场景中的对象相对应的3个变量…

对分过层后的类进行可视化

变量是&#xff1a; std::vector<pcl::PointCloud<pcl::PointXYZRGB>::Ptr> clusters_k_upper std::vector<pcl::PointCloud<pcl::PointXYZRGB>::Ptr> clusters_k_lower std::vector<pcl::PointCloud<pcl::PointXYZRGB>::Ptr> clusters_un…

Win10关机设置里没有睡眠选项的解决方法

用户想给自己的Win10电脑设置睡眠模式&#xff0c;但是在关机设置里面找不到睡眠选项&#xff0c;导致自己不能顺利完成睡眠模式的设置。接下来小编给大家带来解决Win10关机设置里没有睡眠选项的简单方法&#xff0c;解决后用户就可以看到Win10电脑关机设置中有睡眠选项了。 Wi…

Scrum框架中的Sprint

上图就是sprint里要做的事。Sprint是scrum框架的核心&#xff0c;是所有的想法、主意转换为价值的地方。所有实现产品目标的必要工作都在sprint里完成&#xff0c;这些工作主要包括Sprint 计划&#xff08;Sprint planning&#xff09;、每日站会&#xff08;Daily Scrum&#…

Linux CentOS7 添加网卡

一台主机中安装多块网卡&#xff0c;有许多优势。可以实现多项功能。 为了学习网卡参数的设置&#xff0c;可以为主机添加多块网卡。与添加磁盘一样&#xff0c;要在VMware中设置。利用图形化方式或命令行查看或设置网卡。本文仅作一初步讨论。有关网络参数的设置不在讨论之列…

Linux系统编程学习 NO.9——git、gdb

前言 本篇文章简单介绍了Linux操作系统中两个实用的开发工具git版本控制器和gdb调试器。 git 什么是git&#xff1f; git是一款开源的分布式版本控制软件。它不仅具有网络功能&#xff0c;还是服务端与客户端一体的软件。它可以高效的处理程序项目中的版本管理。它是Linux内…

kk模组的具体应用场合

KK模组是一种高精度、高刚度的直线模组&#xff0c;广泛应用于各种自动化设备和精密仪器中。以下是KK模组的一些具体应用场合&#xff1a; 1、半导体设备&#xff1a;半导体制造过程中需要使用精密的定位和运动控制设备&#xff0c;KK模组作为一种高精度、高刚度的直线模组&…

【10套模拟】【6】

关键字&#xff1a; 有向图入度、无向图度、一次深度优先、快速排序平均性能、折半查找、判断是否是二叉排序树、链式直接入插入排序

进程程序替换与exec系统调用

进程程序替换 进程程序替换是指将一个正在运行的进程替换为另一个可执行程序。它的本质是调用了Linux操作系统中的exec系统调用。而exec系统调用是一个家族函数&#xff0c;例如execl、execv、execle、execve等。它们的共同特点是当当前进程执行到该函数时&#xff0c;就会直接…

AI机器学习 | 基于librosa库和使用scikit-learn库中的分类器进行语音识别

专栏集锦&#xff0c;大佬们可以收藏以备不时之需 Spring Cloud实战专栏&#xff1a;https://blog.csdn.net/superdangbo/category_9270827.html Python 实战专栏&#xff1a;https://blog.csdn.net/superdangbo/category_9271194.html Logback 详解专栏&#xff1a;https:/…

mmdet 3.x 打印各类指标

和mmdet2.x中的修改地方不一样&#xff0c;在mmdet/evaluation/metrics/coco_metric.py中第72行将classwise设为True就可以打印各类指标了 但是在test的时候一直都是什么指标都不打印&#xff0c;不管是上面总的指标还是下面的各类指标&#xff0c;暂时不知道怎么处理 找到原因…

二十三种设计模式全面解析-当你的对象需要知道其他对象的状态变化时,观察者模式是你的救星!

在软件设计的世界中&#xff0c;有一种设计模式以其简洁而强大的特性闪耀着光芒&#xff0c;它就是——观察者模式&#xff08;Observer Pattern&#xff09;。这个模式它定义了一种一对多的依赖关系&#xff0c;让多个观察者对象同时监听某一个主题对象&#xff0c;为我们创造…