mysql分库分表分页查询语句_互联网公司牛逼的MySQL分库分表方案

 点击上方5e9d8b025dd14d0aa2e02486544115b7.png

Java架构师社区”关注我们,设为星标

回复"架构师"获取资源

Java架构师带你飞系列:往期回顾

①Docker管理界新增炫酷又实用的瑞士军刀

②又一款Docker/K8s管理平台的瑞士军刀

③架构师带你自建Git服务器①Gogs

④架构师带你自建Git服务器②Gitea

Java架构师带你飞⑤

尤其是互联网公司随着业务发展壮大,数据量也不断增大,不得不考虑分库分表,今天架构师整理出来MySQL分库分表方案供大家参考。

一、数据库瓶颈
不管是IO瓶颈,还是CPU瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载活跃连接数的阈值。在业务Service来看就是,可用数据库连接少甚至无连接可用。接下来就可以想象了吧(并发量、吞吐量、崩溃)。

1、IO瓶颈

第一种:磁盘读IO瓶颈,热点数据太多,数据库缓存放不下,每次查询时会产生大量的IO,降低查询速度 -> 分库和垂直分表。第二种:网络IO瓶颈,请求的数据太多,网络带宽不够 -> 分库。

2、CPU瓶颈

第一种:SQL问题,如SQL中包含join,group by,order by,非索引字段条件查询等,增加CPU运算的操作 -> SQL优化,建立合适的索引,在业务Service层进行业务计算。第二种:单表数据量太大,查询时扫描的行太多,SQL效率低,CPU率先出现瓶颈 -> 水平分表。

二、分库分表

1、水平分库

26335c503c660c2912b23844eee98421.png概念:以字段为依据,按照一定策略(hash、range等),将一个库中的数据拆分到多个库中。结果:
  • 每个库的结构都一样;
  • 每个库的数据都不一样,没有交集;
  • 所有库的并集是全量数据;
场景:系统绝对并发量上来了,分表难以根本上解决问题,并且还没有明显的业务归属来垂直分库。分析:库多了,io和cpu的压力自然可以成倍缓解。

2、水平分表

e24eee170471534212844c74ecc763cb.png概念:以字段为依据,按照一定策略(hash、range等),将一个表中的数据拆分到多个表中。结果:
  • 每个表的结构都一样;
  • 每个表的数据都不一样,没有交集;
  • 所有表的并集是全量数据;
场景:系统绝对并发量并没有上来,只是单表的数据量太多,影响了SQL效率,加重了CPU负担,以至于成为瓶颈。分析:表的数据量少了,单次SQL执行效率高,自然减轻了CPU的负担。

3、垂直分库

f869013259f83ae1fc3fd4b628df086d.png概念:以表为依据,按照业务归属不同,将不同的表拆分到不同的库中。结果:
  • 每个库的结构都不一样;
  • 每个库的数据也不一样,没有交集;
  • 所有库的并集是全量数据;
场景:系统绝对并发量上来了,并且可以抽象出单独的业务模块。分析:到这一步,基本上就可以服务化了。例如,随着业务的发展一些公用的配置表、字典表等越来越多,这时可以将这些表拆到单独的库中,甚至可以服务化。再有,随着业务的发展孵化出了一套业务模式,这时可以将相关的表拆到单独的库中,甚至可以服务化。

4、垂直分表

5fec957b35ffa5339a431124071ee547.png概念:以字段为依据,按照字段的活跃性,将表中字段拆到不同的表(主表和扩展表)中。结果:
  • 每个表的结构都不一样;
  • 每个表的数据也不一样,一般来说,每个表的字段至少有一列交集,一般是主键,用于关联数据;
  • 所有表的并集是全量数据;
场景:系统绝对并发量并没有上来,表的记录并不多,但是字段多,并且热点数据和非热点数据在一起,单行数据所需的存储空间较大。以至于数据库缓存的数据行减少,查询时会去读磁盘数据产生大量的随机读IO,产生IO瓶颈。分析:可以用列表页和详情页来帮助理解。垂直分表的拆分原则是将热点数据(可能会冗余经常一起查询的数据)放在一起作为主表,非热点数据放在一起作为扩展表。这样更多的热点数据就能被缓存下来,进而减少了随机读IO。拆了之后,要想获得全部数据就需要关联两个表来取数据。但记住,千万别用join,因为join不仅会增加CPU负担并且会讲两个表耦合在一起(必须在一个数据库实例上)。关联数据,应该在业务Service层做文章,分别获取主表和扩展表数据然后用关联字段关联得到全部数据。

三、分库分表工具

  • sharding-sphere:jar,前身是sharding-jdbc;
  • TDDL:jar,Taobao Distribute Data Layer;
  • Mycat:中间件。
注:工具的利弊,请自行调研,官网和社区优先。

四、分库分表步骤

根据容量(当前容量和增长量)评估分库或分表个数 -> 选key(均匀)-> 分表规则(hash或range等)-> 执行(一般双写)-> 扩容问题(尽量减少数据的移动)。五、分库分表问题

1、非partition key的查询问题

基于水平分库分表,拆分策略为常用的hash法。端上除了partition key只有一个非partition key作为条件查询映射法0dbadea01e32dc9af3ed4cab06ab20a3.png基因法5dc2dff4f8ffbfcc950ba540a0c873d2.png
注:写入时,基因法生成user_id,如图。关于xbit基因,例如要分8张表,23=8,故x取3,即3bit基因。根据user_id查询时可直接取模路由到对应的分库或分表。根据user_name查询时,先通过user_name_code生成函数生成user_name_code再对其取模路由到对应的分库或分表。id生成常用snowflake算法。
端上除了partition key不止一个非partition key作为条件查询映射法bff5364200ced906020246f37dd94049.png冗余法d11c8581b3f177153fafa433672d1363.png
注:按照order_id或buyer_id查询时路由到db_o_buyer库中,按照seller_id查询时路由到db_o_seller库中。感觉有点本末倒置!有其他好的办法吗?改变技术栈呢?
后台除了partition key还有各种非partition key组合条件查询NoSQL法e85f98e82d6506f0dcdfcacc777b388b.png冗余法fd5ccf5f8b16e87dda6e40a9a5f2541a.png

2、非partition key跨库跨表分页查询问题

基于水平分库分表,拆分策略为常用的hash法。
注:用NoSQL法解决(ES等)。

3、扩容问题

基于水平分库分表,拆分策略为常用的hash法。水平扩容库(升级从库法)3b17ef4d888ce0cb41c3f76a85632311.png
注:扩容是成倍的。
水平扩容表(双写迁移法)03259c66c8aa3ff2ef10f7040fd64465.png
  • 第一步:(同步双写)修改应用配置和代码,加上双写,部署;
  • 第二步:(同步双写)将老库中的老数据复制到新库中;
  • 第三步:(同步双写)以老库为准校对新库中的老数据;
  • 第四步:(同步双写)修改应用配置和代码,去掉双写,部署;
注:双写是通用方案。

六、分库分表总结

  • 分库分表,首先得知道瓶颈在哪里,然后才能合理地拆分(分库还是分表?水平还是垂直?分几个?)。且不可为了分库分表而拆分。
  • 选key很重要,既要考虑到拆分均匀,也要考虑到非partition key的查询。
  • 只要能满足需求,拆分规则越简单越好。

七、分库分表示例

示例GitHub地址:https://github.com/littlecharacter4s/study-sharding

文章来源:https://javajgs.com/archives/1464


这些年小编给你分享过的干货

《你们公司的架构师是什么样的?》

《Docker与CI持续集成/CD持续部署》

《还有40天,Java 11就要横空出世了》

《JDK 10 的 109 项新特性》

《学习微服务的十大理由》

《进大厂必须掌握的50个微服务面试问题》

3fa84e1fbe683648b004832f11d5c83f.png

小程序打卡送书,点击?查看

d8f6067aec81b77c5fbfe4e78c4f1bd7.gif

96a3fd779a9becf353a4241ac1bf1365.png

朕已阅

【Pytorch】DCGAN实战(三):二次元动漫头像生成 文章目录1.实现效果2.环境配置2.1Python2.2Pytorch、CUDA2.3Python IDE3.具体实现3.1数据预处理(data.py)(1)导入包(2)定义数据类3.2模型Generator,Discriminator,权重初始化(model.py)(1)导入包(2)Generator(3)Discriminator(4)权重初始化3.3网络训练(net.py)(1)导入包(2)创建类3.4 主函数(main.py)(1)导入文件(2)定义超参数(3)实例化(4)进行训练4.训练过程4.1 阅读详情

相关推荐

分库分表后,如何优雅实现高效分页查询?5大方法对比揭秘

分库分表后的高效分页查询方案 分库分表后,传统分页查询面临数据分布不均、全局排序困难等问题。本文探讨五种解决方案: 全局查询法:简单但性能低,需合并排序所有分库数据; 禁止跳页法:仅支持逐页查询,避免深度分页,适合移动端; 精度损失法:牺牲数据精度减少查询量,适用非高精度场景; 二次查询法:首次粗查定位,二次精查数据,平衡性能与准确性; 中间法:通过索引快速定位目标数据,适合高频分页场景。 选择方案需结合业务需求(如数据精度)、系统架构及技术栈(如ShardingSphere或Django优化)。合理设

java专栏 1345

MSSQLServer数据(水平分割)

① 创建数据库 ② 在创建的数据库中添加文件组 ③ 在文件组中添加新的文件 ④ 定义分区函数 ⑤ 定义分区架构 ⑥ 定义分区 ⑦ 定义代理作业,自动添加分区分割点 ⑧ 测试数据

MySQL查询定位与优化:从日志分析到执行计划全解析

本文详细解析了MySQL查询的定位与优化方法。首先介绍了慢查询的危害及记录慢查询日志的配置方式,包括临时和永久开启方法。其次讲解了如何通过mysqldumpslow和pt-query-digest等工具分析慢查询日志,重点关注执行时间、锁等待等关键指标。最后深入剖析了EXPLAIN执行计划的解读技巧,包括各项参数含义和典型问题案例分析,帮助开发者系统性地解决SQL性能问题。文章还提供了相关学习教程链接,涵盖Java、Oracle等技术的进阶内容。

王大师企业官方博客 1269

BAT公司万亿海量数据分页秒级查询落地方案实现

在这个互联网高速发展的时代,数据呈指数级增长,像国内BAT一样的大企业数据量积累已经达到万亿级别,对于这么大的数据量,该怎么做到分页的秒级甚至毫秒级的响应时效呢?我们该怎么存储设计以及查询设计呢?    本课程将讲解万亿海量级数据存储方案以及秒级查询方案,并且落地实现。该课程将采用循序渐进方式一步一步带大家实现该系统,中间将穿插一些技术知识点讲解,让大家实现系统的同时,更深入理解其中的技术点。该课程系统最终是一个可用的分页秒级查询落地实现项目,包含解决方案以及实现,商业价极高。大家可以根据自己企业的特定需求,稍加改造就可以用到自己企业的项目中去。 开发环境概述 开发工具:IDEA本课程用到技术:Spring  Boot  2.1.0.RELEASESpring  Cloud Greenwich.SR5Mybatis、Redis、QuartzAOP、自定义注解、反射技术Openfeign、EurekaThreadLocalThymeleafjQuery、AjaxMaven等企业一线架构师讲授,代码在老师的指导下企业可以复用,提供企业解决方案。  版权归作者所有,盗版将进行法律维权。 

分库分表分页查询解决方案

分库分表分页查询解决方案 不管是随着业务量的增大、还是随着用户数量的增长,在单一中无法承受大量大数据,导致查询速度极慢甚至拖垮数据库。所以分库分表的策略随之应用,但是如何在分库分表的情况下,进行分页查询,目前仍是业界难题。 本文记录了三种情况下,对于分库分表下的分页查询优化方案。 1 目前大多数的解决方案 不管是目前的一些数据库中间件例如Mycat,还是ElasticSearch下的分片查......

lvqinglou的博客 3万+

分库分表后怎么分页查询

全局查询法:这种方案最简单,但是随着页码的增加,性能越来越低禁止跳页查询法:这种方案是在业务上更改,不能跳页查询,由于只返回一页数据,性能较高二次查询法:数据精确,在数据分布均衡的情况下适用,查询数据较少,不会随着翻页增加数据的返回量,性能较高。

qq_36176028的博客 6483

牛逼!京东把 Elasticsearch 用得真牛逼!日均5亿订单查询完美解决!

点击上方 "程序员小乐"关注,星标或置顶一起成长每天凌晨00点00分,第一时间与你相约每日英文Life is like a mirror. Smile at it, ...

程序员小乐 1233

WC!用了个 insert into select 居然被开除了!

因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享点击关注#互联网架构师公众号,领取架构师全套资料 都在这里0、2T架构师学习资料干货分上一篇:2T架构师学习资料干货分享大家好,我是互联网架构师!血一般的教训,请慎用insert into select。同事应用之后,导致公司损失了近10w元,最终被公司开除。事情的起因公司的交易量比较大,使用的数据库是mysql,每天的增量差不...

emprere的博客 88

SQL Server分区步骤

SQL Server分区步骤

u010466666的专栏 3226

SQL Server 分区

仅个人记录学习

weixin_43888054的博客 1939

SqlServer五种分策略

垂直分是将一个大按列分成多个小。每个小包含原的一部分列,共同使用相同的主键。水平分是将一个大按行分成多个小。通常根据某个分区键(如ID、日期)来分割数据。混合分结合垂直分和水平分,先按列分,再对分后的数据进行水平分,或反过来。分区是在同一个逻辑中使用物理上的分区来存储数据。每个分区包含的一部分数据,通常根据某个分区键来划分。索引视图是将视图的结果物化存储,并对视图进行索引,以提高查询性能。

AngelCryToo的专栏 2267

SQLServer2008 R2大数据的分区实现

如果你的数据库中某一个中的数据满足以下几个条件,那么你就要考虑创建分区了。 1、数据库中某个中的数据很多。很多是什么概念?一万条?两万条?还是十万条、一百万条?这个,我觉得是仁者见仁、智者见智的问题。当然数据中的数据多到查询时明显感觉到数据很慢了,那么,你就可以考虑使用分区了。如果非要我说一个数的话,我认为是100万条。 2、但是,数据多了并不是创建分区的惟一条件,哪怕你有一千万条记录,但是这一千万条记录都是常用的记录,那么最好也不要使用分区,说不定会得不偿失。只有你的数...

hao114500043的专栏 973

SQL Server数据库分区分

当一个数据数据量达到千万级别以后,每次查询都需要消耗大量的时间,所以当数据量达到一定量级后我们需要对数据水平切割。水平分区分就是把逻辑上的一个,在物理上按照你指定的规则分放到不同的文件里,把一个大的数据文件拆分为多个小文件,还可以把这些小文件放在不同的磁盘下。这样把一个大的文件拆分成多个小文件,便于我们对数据的管理。 下面我们来创建分区 代码创建分区 添加文件组 代码格式:...

mango_love的专栏 1万+

分库分表问题及处理方案

一、为什么要进行分库分表MySQL数据量过大,比如超过5千万条的时候,读写性能变得很差。而且常规的优化手段已经不起作用了,比如:SQL调优、添加索引、主从复制、读写分离。这时候就需要用到MySQL终极优化方案分库分表。二、怎么判断项目是需要分库还是要分?是先分库还是先分至于先分库还是先分?建议先分,如果分能解决问题,就不需要分库了,毕竟需要单独服务器资源,成本更高。三、分库分表有哪些拆分方案分库分表有垂直拆分和水平拆分,垂直拆分又有垂直分库、垂直分

YoungJ_Zhou的博客 2585

java项目案例开发-第一章 Acess,MySQL,Tomcat

1.1 Access 利用Access创建间关系,并填写数据。 1.2 MySQL的使用 问题: 1、在用数据库Access过程中说主引用字段找不到唯一索引是怎么回事啊? 主中未设置主键,在建立关系时就会这样显示。一般来说,主中都有一个字段是不重复的,用它来做主键。如学生中的学生编号是唯一的,不重复的,就可做主键。如果没设置主键,学生编号重复,当它与其它(如成

xiaoxik的博客 737

sql server 数据库分区分

sql server 数据库分区分 作为演示,本文使用的数据库 sql server 2017 管理工具 sql server management studio 18,,创建数据库mytest,添加Test,Test列为 id和name,具体可以自行创建 sql server 数据库分区分具体步骤如下 1、选择数据库选择右键 新建查询,内容如下 --数据库分区分 --1、给数据库mytest添加文件分组 ALTER DATABASE mytest add filegroup group

LongtengGensSupreme博客 1646

百亿级数据 分库分表 后面怎么分页查询

全局查询法:这种方案最简单,但是随着页码的增加,性能越来越低禁止跳页查询法:这种方案是在业务上更改,不能跳页查询,由于只返回一页数据,性能较高二次查询法:数据精确,在数据分布均衡的情况下适用,查询数据较少,不会随着翻页增加数据的返回量,性能较高。

weixin_57907028的博客 8959

SQL SERVER 分区

SERVER的分区功能是为了将一个大中含有非常多条数据)的数据根据某条件(仅限该的主键)拆分成多个文件存放,以提高查询数据时的效率。创建分区的主要步骤是。(按拆分函数拆分后需要对应到哪些文件组中去)。不是企业版的sql server不支持分区;1、确定需要以哪一个字段作为分区条件;2、拆分成多少个文件保存该

wangqiaowq的博客 2571

sql server 分区

注:应将文件组和文件存放于不同的硬盘甚至不同的服务器中,因为数据的读取瓶颈很大程度在于硬盘的读写速度,多个硬盘存储一个可以实现负载均衡。分区是在SQL Server 2005之后的版本引入的特性,这个特性允许把。如果想具体知道每个物理分区中存放了哪些记录,也可以使用。注:即哪些区域使用哪个分区函数,形成完整的分区方案。上的一个在物理上分为很多部分。上看是将一个大分成几个小,但是从。上看,还是一个大。1)创建数据库文件组。注:声明分区的标准。

Kaizen的博客 1704

烽火交换机配置手册

fiberhome s4800-28t-gf-pe全千兆二层电信级以太网交换机 命令行手册 r1.0.pdf

上一篇: 如何区分网线是几类的_什么是超五类双屏蔽网线?怎么区分双屏网线和非屏蔽网线?...
下一篇: sql server 多表更新_sql(1)
weixin_39701768
博客等级 码龄9年 21粉丝 156原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值