【MYSQL】分库分表

embedded/2024/11/17 15:57:43/

一、什么是分库分表

        

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

二、为什么要分库分表

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

        分库是因为在单一数据库的情况下,单一数据库存储空间有限,如果存储到达临界,需要分配物理存储资源,所以可以通过分库来增加数据存储量。在大量进行插入操作的时候,对单一数据库的性能会影响很大,所以使用分库可以将单一数据库分成多个库承受插入操作,性能会更高。还有单一数据库在高并发的情况下很容易连接数用尽,报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.ppmy.cn/embedded/138285.html

相关文章

uniapp中h5端如何引用本地json数据(json文件)

前言 uniapp读取本地json数据文件&#xff0c;有下面两种方式可以实现&#xff1a; 文件后缀为.json类型文件后缀为.js类型 这里展示后缀为.js类型的处理方式 1、在static中创建后缀为.js的文件存储json数据。 注意使用export导出 2、在要使用的页面导入 <template>…

windows系统开发环境使用docker打包Django程序部署至服务器Ubuntu系统中

正常创建开发Django项目即可&#xff0c;推荐使用虚拟环境开发 &#xff08;virtualenv&#xff09; 在Ubuntu安装docker 在windows系统安装docker 链接 需要启用WSL 2&#xff0c;这个可以在Microsoft store 下载Ubuntu系统 docker默认安装在c盘&#xff0c;会占用很多空间&am…

【ORACLE战报】2024年10月OCP考试战报

原创 厦门微思网络 微思 | 新班预告&#xff1a; 所有的收获都是默默耕耘的成果 2024.10月【最新考试成绩出炉】 来吧&#xff0c;展示 &#xff08;以下为部分学员成绩单&#xff09; &#xff08;部分学员证书&#xff09; 往期考试战报回顾&#xff1a; 【ORACLE战报】…

Rust开发一个命令行工具(一,简单版持续更新)

依赖的包 cargo add clap --features derive clap命令行参数解析 项目目录 代码 main.rs mod utils;use clap::Parser; use utils::{editor::open_in_vscode,fs_tools::{file_exists, get_file, is_dir, list_dir, read_file}, }; /// 在文件中搜索模式并显示包含它的行。…

JMeter初体验:从入门到入门的性能测试之旅

一、关于性能测试 1、性能测试概述 性能测试是一种非功能测试&#xff0c;旨在评估系统在不同负载条件下的性能表现。它包括负载测试、压力测试、稳定性测试和基准测试等。性能测试的目的是确保系统在预期的负载下能够正常运行&#xff0c;并满足用户对响应时间、吞吐量和其他…

新版Apache tomcat服务安装 Mac+Window双环境(笔记)

简介&#xff1a;Tomcat服务器器的下载和安装&#xff1a; 安装前提 1&#xff09;电脑需要有java环境&#xff0c;jdk8以上&#xff0c;否则启动不不成功 2&#xff09;已经安装Sublime⽂文件编辑软件 3&#xff09;window电脑需要显示⽂文件拓拓展名 官网&#xff08;https:…

【安卓恶意软件检测-论文】DroidEvoler:自我进化的 Android 恶意软件检测系统

DroidEvolver&#xff1a;自我进化的 Android 恶意软件检测系统 摘要 鉴于Android框架的频繁变化和Android恶意软件的不断演变&#xff0c;随着时间的推移以有效且可扩展的方式检测恶意软件具有挑战性。为了应对这一挑战&#xff0c;我们提出了DroidEvolver&#xff0c;这是一…

【Qt实现虚拟键盘】

Qt实现虚拟键盘 &#x1f31f;项目分析&#x1f31f;实现方式&#x1f31f;开发流程 &#x1f31f;项目分析 需求&#xff1a;为Linux环境下提供可便捷使用的虚拟键盘OS环境&#xff1a;Windows 7/11、CentOS 7开发语言&#xff1a;Qt/C IDE&#xff1a;QtCreator 、Qt5.14.2功…