数据库的分库分表 详解

前言

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

首先单机数据库所能承载的连接数,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,肯定不会重复,但是因为主键不是自增的可能会产生页分裂。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

阿里巴巴java开发手册-编程规约

编程规约 命名风格常量定义代码格式OOP 规约日期时间集合处理并发处理控制语句注释规约前后端规约其他 命名风格 【强制】代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。 反例:_name / name / n a m e / n a m e / n a m e…

腾讯云服务器租用价格,腾讯云服务器价格流量怎么算?

首先,让我们来看看腾讯云服务器租用价格。根据您的需求不同,腾讯云提供了多种不同的配置选项,从轻量级应用服务器到高性能的GPU服务器,都可以满足您的需求。以下是一些常见的腾讯云服务器租用价格: 一、腾讯云服务器租…

vs2017 编译Qt 5.11.2 源码

SDK 10.0.22000.194 有 2种编译方式 ,第二种 看下面 方式一: 1、问题描述: 使用VS编译程序时,运行库选择多线程(/MT),表示采用多线程静态release的方式进行编译。 但是,发现编译是不能通过的…

使用 Filebeat+Easysearch+Console 打造日志管理平台

近年来,日志管理平台越来越流行。使用日志管理平台可以实时地、统一地、方便地管理和查看日志,挖掘日志数据价值,驱动运维、运营,提升服务管理效率。 方案架构 Beats 是轻量级采集器,包括 Filebeat、Metricbeat 等。E…

记一次服务器配置文件获取OSS

一、漏洞原因 由于网站登录口未做双因子校验,导致可以通过暴力破解获取管理员账号,成功进入系统;未对上传的格式和内容进行校验,可以任意文件上传获取服务器权限;由于服务器上配置信息,可以进一步获取数据库权限和OSS管理权限。二、漏洞成果 弱口令获取网站的管理员权限通…

资产设备管理系统

dtAsset 是一个固定资产设备管理系统,它专为中小企业的需求而设计。该软件提供了对常用资产设备进行信息化管理的功能,并支持自定义设备类型、导入导出数据、维护工作统计、采购管理、文档管理、运维监控 (使用 Zabbix)、知识库等功能。 主要模块 1.系统…

ogrinfo不是内部或者外部命令

这个是GDAL的问题,我是通过OSGeo4w安装的,出来就是这个问题,教程没有仔细看干。 第一次安装,选择express install!!!! 第一次安装,选择express install!&…

动手学深度学习——循环神经网络的简洁实现(代码详解)

文章目录 循环神经网络的简洁实现1. 定义模型2. 训练与预测 循环神经网络的简洁实现 # 使用深度学习框架的高级API提供的函数更有效地实现相同的语言模型 import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2lbatch_size, …

黑马程序员 学成在线项目 第1章 项目介绍环境搭建v3.1

第1章 项目介绍&环境搭建v3.1 1.项目背景 1.1 在线教育市场环境 以下内容摘自艾瑞:2020年在线教育行业洞察:To B赛道篇_网络服务_艾瑞网 在线教育行业是一个有着极强的广度和深度的行业,从校内到校外;从早幼教到职业培训&…

【Python】逆向与爬虫的故事

目录 一、前言 二、爬虫 1、什么是爬虫? 2、Python 爬虫的主要工具 3、爬虫的基本流程 4、实例代码 三、逆向 1、什么是逆向? 2、Python 逆向的主要工具 3、逆向的基本流程 4、实例代码 四、总结 一、前言 随着互联网技术的发展&#xff0c…

RIP路由信息协议

RIP路由信息协议(Routing Information Protocol) 最先得到广泛应用的协议,最大优点是简单要求网络中的每个路由器都要维护一张表,表中记录了从它自己到其他每一个目的网络的距离RIP是应用层协议,它在传输层使用UDP,RIP报文作为UD…

2023.11.18 - hadoop之zookeeper分布式协调服务

1.zookeeper简介 ZooKeeper概念: Zookeeper是一个分布式协调服务的开源框架。本质上是一个分布式的小文件存储系统 ZooKeeper作用: 主要用来解决分布式集群中应用系统的一致性问题。 ZooKeeper结构: 采用树形层次结构,没有目录与文件之分,ZooKeeper树中的每个节点被…

HDMI之EDID析义篇

DisplayID Type X Video Timing Data Block 实例 F0 2A 10 93 FF 0E 6F 08 8F 10 93 7F 07 37 04 8F 10该数据来源于SHARP AQUOS-TVE23A 4K144Hz电视机的第3个EDID块(基于HF-EEODB)。 定义 解释 VTDB 1: 3840x2160 144.000009 Hz 16:9 333.216 kHz 1343.527000 MHz (RBv3,h…

STM32 HAL库函数HAL_SPI_Receive_IT和HAL_SPI_Receive的区别

背景 前段时间开发一个按键板驱动,该板用的STM32F103系列单片机,前任工程师用STM32CubeMX生成的工程,里面全是HAL库调用,我接手后,学习了下HAL库的用法,踩坑不少,特别是带IT后缀的函数&#xf…

深入了解Java 8 新特性:lambda表达式进阶

阅读建议 嗨,伙计!刷到这篇文章咱们就是有缘人,在阅读这篇文章前我有一些建议: 本篇文章大概7000多字,预计阅读时间长需要10分钟。本篇文章的实战性、理论性较强,是一篇质量分数较高的技术干货文章&#…

【GUI】-- 09 JComboBox JList、JTextField JPasswordField JTextArea

GUI编程 03 Swing 3.6 列表 下拉框 package com.duo.lesson06;import javax.swing.*; import java.awt.*;public class ComboBoxDemo01 extends JFrame {public ComboBoxDemo01() throws HeadlessException {Container contentPane getContentPane();JComboBox<Object&…

stable diffusion十七种controlnet详细使用方法总结

个人网站&#xff1a;https://tianfeng.space 前言 最近不知道发点什么&#xff0c;做个controlnet 使用方法总结好了&#xff0c;如果你们对所有controlnet用法&#xff0c;可能了解但是有点模糊&#xff0c;希望能对你们有用。 一、SD controlnet 我统一下其他参数&#…

如何去掉照片中多余路人?一分钟帮你搞定

在外出拍照时&#xff0c;可能会遇到一些不希望出现在照片中的路人&#xff0c;比如在旅游景点、公共场所或者街头拍摄时突然闯入镜头的人。这些路人的出现可能会破坏照片的整体氛围&#xff0c;影响照片的美观度。因此&#xff0c;需要使用一些方法去掉这些多余的路人&#xf…

mysql慢查询日志分析工具(pt-query-digest)

首先说下安装mysql自带的分析工具&#xff1a;mysqldumpslow mysqldumpslow -t 3 /var/lib/mysql/localhost-slow.log 因为mysqldumpslow看到的信息有限&#xff0c;只是获取语句的基础信息&#xff0c;并不是很全面。下面介绍一个功能很强大的分析工具。 pt-query-digest pt…