【MYSQL】分库分表

一、什么是分库分表

        

        分库分表就是指在一个数据库在存储数据过大,或者一个表存储数据过多的情况下,为了提高数据存储的可持续性,查询数据的性能而进行的将单一库或者表分成多个库,表使用。

二、为什么要分库分表

        分库分表其实是两个操作,分库是指将单一数据库分成多个数据库使用,分表是指将单一表分成多个表使用。

        分库是因为在单一数据库的情况下,单一数据库存储空间有限,如果存储到达临界,需要分配物理存储资源,所以可以通过分库来增加数据存储量。在大量进行插入操作的时候,对单一数据库的性能会影响很大,所以使用分库可以将单一数据库分成多个库承受插入操作,性能会更高。还有单一数据库在高并发的情况下很容易连接数用尽,报too many connection,可以通过配置文件设置最大连接数。用分库的话会有多个数据库,承受并发情况更好,线程用尽的情况更小一些。

        

        分表是因为单一数据表的存储数据容量过大,对于阿里规范中它说明是单一表的存储容量大于2G,或单表存储数据的容量大于500w,通过命中索引,优化SQL对于查询数据的效率没有提升的情况下就需要分表。

三、怎么分库分表

        分库分表实际上分为有两种分发,一种是垂直分库分表,另一种是水平分库分表。

        1.垂直分库分表

        垂直分库的意思就是,将一个数据库里的多个表拆分,例如有数据库A和B,数据库本应该有1234张表,垂直分库的意思是将库中的某几张表存到A中,剩下的存储到B中。

        垂直分表的意思是,表中有字段1234,现在将这个数据表中的数据拆分到两个表A、B中,比如A表存储字段123,B表存储4,然后A表和B表可以通过一个主键外键相关联。这样的好处是指,因为一个表中一个数据存储过大,但是有几个字段不频繁使用,如果在大量频繁查询的过程会造成I/O增加。

        对于垂直分库的情况下原本同一张数据表中的内容分到不同的库中不同表中,对于查询全部字段的时候就需要多表联查,但是在mycat中有些版本不支持,所以需要将某些表设置成全局表,这样就能在每个库都有该表,可以进行多表联查。

        2.水平分库分表

        水平分库的意思和水平分表的意思差不多。水平分库指将库中的数据表与另一个库的表一块进行存储数据。分表意思是两个表同时对同一种数据进行存储。

        这种就行避免单表进行查询的时候,在索引sql优化之后还是查询慢的情况。

        学过一种是代理模式的叫做mycat的中间件(可以进行分库分表,还可以进行读写分离),这种有一个虚拟库,通过配置虚拟表然后配置节点,以及节点信息,比如设置dataHost路由信息。对于分库水平分表还需要设置分片规则,比如常用的根据id范围分配,取模分片,将主键转成2进制与对应个1取余后根据范围分配,还有枚举分片,一致性hash分配指的是将主键根据hash算法算出后,存储到对应的分片的表中,还有按照时间进行分片。

四、分库分表可能会出现的问题

        1.联合查询的时候跨节点查询

                这种情况下有些版本或者其他中间件可能会智能联查,但实际上就是通过不同库的不同表中间的数据,直接查出来最后合并后返回结构,过程复杂繁琐。

        2.全局唯一主键

                对于不同库或者不同表中,存储数据可能会出现id唯一的问题,主键肯定是要唯一的,但是对于分表后还要保持id唯一是不太容易的,可以设置一个表专门设置主键id自增,分表存储数据时候可以根据这个id存到数据表的主键里。不过这个id 是由数据库生成的并且由单表生成,如果并发大的情况下这个表压力会过大生产较慢。或者使用UUID,这种是全局唯一的id但是它的顺序可能不一致,可能会出现存储过程IO消耗过大,因为可能会出现页分裂现象。还有就是雪花算法这种虽然id的长度过大,但是自增且唯一。

        3.实物一致性的问题

                对于多个表,如果是垂直分库的情况下,插入数据无法保证两个库的数据都同时存储成功,或者都失败,失败后回滚。

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

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

相关文章

Spring纯注解开发

在我的另一篇文章中(初识Spring-CSDN博客),讲述了Bean,以及通过xml方式定义Bean。接下来将讲解通过注解的方法管理Bean。 我们在创建具体的类的时候,可以直接在类的上面标明“注解”,以此来声明类。 1. 常…

git push时报错! [rejected] master -> master (fetch first)error: ...

错误描述:在我向远程仓库push代码时,即执行 git push origin master命令时发生的错误。直接上错误截图。 错误截图 错误原因: 在网上查了许多资料,是因为Git仓库中已经有一部分代码,它不允许你直接把你的代码覆盖上去…

java常用工具包介绍

Java 作为一种广泛使用的编程语言,提供了丰富的标准库和工具包来帮助开发者高效地进行开发。这些工具包涵盖了从基础的数据类型操作到高级的网络编程、数据库连接等各个方面。下面是一些 Java 中常用的工具包(Package)及其简要介绍&#xff1…

latex中,两个相邻的表格,怎样留一定的空白

目录 问题描述 问题解决 问题描述 在使用latex写论文时,经常表格需要置顶写,则会出现两个表格连在一起的情况。下一个表名容易与上面的横线相连,如何通过明令,留出一定的空白。 问题解决 在第二个表格的 \centering命令之后…

react中如何在一张图片上加一个灰色蒙层,并添加事件?

最终效果: 实现原理: 移动到图片上的时候,给img加一个伪类 !!此时就要地方要注意了,因为img标签是闭合的标签,无法直接添加 伪类(::after),所以 我是在img外…

C++builder中的人工智能(27):如何将 GPT-3 API 集成到 C++ 中

人工智能软件和硬件技术正在迅速发展。我们每天都能看到新的进步。其中一个巨大的飞跃是我们拥有更多基于自然语言处理(NLP)和深度学习(DL)机制的逻辑性更强的AI聊天应用。有许多AI工具可以用来开发由C、C、Delphi、Python等编程语…

【项目开发】URL中井号(#)的技术细节

未经许可,不得转载。 文章目录 前言一、# 的基本含义二、# 不参与 HTTP 请求三、# 后的字符处理机制四、# 的变化不会触发网页重新加载五、# 的变化会记录在浏览器历史中六、通过 window.location.hash 操作七、onhashchange 事件八、Google 对 # 的处理机制前言 2023 年 9 月…

AUTOSAR_EXP_ARAComAPI的7章笔记(5)

☞返回总目录 相关总结:典型的 SOME/IP 多绑定用例总结 7.3.3 典型的SOME/IP多绑定用例 在前面的章节中,我们简要提到,在一个典型的SOME/IP 网络协议的部署场景中,AP SWC不太可能自己打开套接字连接来与远程服务通信。为什么不…

Jenkins下载安装、构建部署到linux远程启动运行

Jenkins详细教程 Winodws下载安装Jenkins一、Jenkins配置Plugins插件管理1、汉化插件2、Maven插件3、重启Jenkins:Restart Safely插件4、文件传输:Publish Over SSH5、gitee插件6、清理插件:workspace cleanup system系统配置1、Gitee配置2、…

Flutter:Dio下载文件到本地

import dart:io; import package:dio/dio.dart;main(){// 创建dio对象final dio Dio();// 下载地址var url https://*******.org/files/1.0.0.apk;// 手机端路径String savePath Directory.systemTemp.path/ceshi.apk;print(savePath);downLoad(dio,url,savePath); }downLo…

【C++笔记】C++三大特性之多态

【C笔记】C三大特性之多态 🔥个人主页:大白的编程日记 🔥专栏:C笔记 文章目录 【C笔记】C三大特性之多态前言一.多态1.1 多态的概念1.2 虚函数1.3 虚函数的重写/覆盖1.4 多态的定义及实现 二.虚函数重写的⼀些其他问题2.1 协变(…

2.STM32之通信接口《精讲》之USART通信

有关通信详解进我主页观看其他文章!【免费】SPIIICUARTRS232/485-详细版_UART、IIC、SPI资源-CSDN文库 通过以上可以看出。根据电频标准,可以分为TTL电平,RS232电平,RS485电平,这些本质上都属于串口通信。有区别的仅是…

麒麟V10,arm64,离线安装docker和docker-compose

文章目录 一、下载1.1 docker1.2 docker-compose1.3 docker.service 二、安装三、验证安装成功3.1 docker3.2 docker-compose 需要在离线环境的系统了里面安装docker。目前国产化主推的是麒麟os和鲲鹏的cpu,这块的教程还比较少,记录一下。 # cat /etc/ky…

云原生之运维监控实践-使用Telegraf、Prometheus与Grafana实现对InfluxDB服务的监测

背景 如果你要为应用程序构建规范或用户故事,那么务必先把应用程序每个组件的监控指标考虑进来,千万不要等到项目结束或部署之前再做这件事情。——《Prometheus监控实战》 去年写了一篇在Docker环境下部署若依微服务ruoyi-cloud项目的文章,当…

三十九、Python(pytest框架-中)

一、执行用例的方式 1.工具执行 2.在终端使用命令行运行 命令:pytest -s 用例代码文件 -s 的作用是输出显示代码中的 print。 3.在主函数main中执行 if __name__ "__main__": # 主函数pytest.main([-s, 用例代码文件]) import pytestclass TestDemo…

丹摩征文活动|丹摩助力selenium实现大麦网抢票

丹摩征文活动|丹摩助力selenium实现大麦网抢票 1.引言 在人工智能飞速发展的今天,丹摩智算平台(DAMODEL)以其卓越的AI算力服务脱颖而出,为开发者提供了一个简化AI开发流程的强大工具。通过租赁GPU资源,丹…

【计算机网络】协议定制

一、结构化数据传输流程 这里涉及协议定制、序列化/反序列化的知识 对于序列化和反序列化,有现成的解决方案:①json ②probuff ③xml 二、理解发送接收函数 我们调用的所有发送/接收函数,根本就不是把数据发送到网络中!本质都是…

大数据-226 离线数仓 - Flume 优化配置 自定义拦截器 拦截原理 拦截器实现 Java

点一下关注吧!!!非常感谢!!持续更新!!! Java篇开始了! 目前开始更新 MyBatis,一起深入浅出! 目前已经更新到了: Hadoop&#xff0…

AI行业动态:AGI预测、模型进化与工具革新

本周,人工智能(AI)领域的新闻层出不穷,从关于通用人工智能(AGI)何时到来的预测,到模型训练与推理技术的突破,再到各种实用工具的更新迭代,精彩纷呈。让我们一起深入了解这…

vue3 如何调用第三方npm包内部的 pinia 状态管理库方法

抛砖引玉: 如果在开发vue3项目是, 引用了npm第三方包 ,而且这个包内使用了Pinia 状态管理库,那我们如何去调用 npm内部的 Pinia 状态管理库呢? 实际遇到的问题: 今天在制作npm包时遇到的问题,之前Vue2版本的时候状态管理库用的Vuex ,当时调用npm包内的状态管理库很简单,直接引…