mysql分库分表分片分区及常见问题

1.前言

MySQL单库数据量在5000万以内性能比较好,超过阈值后性能会随着数据量的增大而变弱。MySQL单表的数据量是500w-1000w之间性能比较好,超过1000w性能也会下降。

2.mysql分布式

  1. 分库

分库一般有两种目的:将库中不同表进行拆分,将库中某个表进行拆分,目标就是降低单库的数据量,从而提高io能力和并发能力。

将不同表拆分即将不同的大表移动到其他库中,缓解单库压力,通过多数据源即可进行切换查询,成本最低。

将相同表进行拆分,需要根据某种规则进行拆分,比如按照时间、按照某个主键,这种方式既进行了分表也进行了分库,属于分片的范畴。

  1. 分表

分表分为垂直划分和水平划分。

垂直划分即将不同的字段进行拆分。比如一个学生表中,含有年龄、班级、成绩等属性。我们可以将其拆分为学生、年龄表和学生、成绩表,防止某个属性过大,造成单表的数据量不大,但占用空间极大,造成io缓慢。

水平划分即可通过主键区间划分,或者主键取模或者位运算。这些方式均是将数据水平拆分,每个表的数据结构都是一样的,将数据打散到多个表中,降低单表的数据量,提高能力。

  1. 分区

mysql提供的一种能力。首先 mysql的文件分为三个,具体名字不做阐述,分别为存储表结构、存储数据文件、存储索引数据。分区时,可按照list、hash、区间等多个方式进行分区,将这存储数据的两个文件打散,根据以上的规则分为多个文件。实际仍处于同一个库同一个表中,只是文件切割开,不同的分区文件可以存储咋不同的磁盘上,不允许跨DB。

  1. 分片

分片是将表中数据按照某种规则放到多个库中,既分表又分库,就相当于原先一个库中的一个表,现在放到了好多个表里面,然后这好多个表又分散到了好多个库中。它可以提高 MySQL 数据库的读写性能,特别是在读多写少的情况下。

image.png

以上是数据库方面的性能增强,总结以上为,单库单表存在性能瓶颈,我们首先突破单表,接着突破单库,突破单机器,将磁盘更换为ssd,增强读写性能。数据库的性能一部分在于自身的局限性,一部分在于硬件的性能。

日常开发中,我们也需要对数据库进行监控,查看cpu数值、硬盘使用率等,监控慢sql,监控数据库连接数。

总结历史问题如下:

1.之前出现过多次,因慢sql导致数据库连接池被打满导致后续无连接问题。

2.也出现过,因多个系统同时连接一个库,导致连接数暴增。

3.亦出现过,因调整服务读写分离,使用不同数据源时,未配置新插件的数据库连接池大小,导致连接数过小,请求数一多,就将数据库链接打满,导致无法响应了。所以设置好服务的数据库连接池数也是重中之重。

4.事务开启过大,导致死锁、回滚时间长、易发生异常回滚、数据库连接池占满、接口性能差

5.通过非索引字段进行更新操作,导致间隙锁的发生,最终死锁。

6.事务中,开启分布式锁,事务结束前,解锁,导致并发问题。

7.查询sql中未对空值进行校验,导致查询全表数据,直接oom

8.查询sql未命中索引,导致查询语句过慢,连接池被打满。

总结以上,慢sql致命。

$(function(){ $.fn.extend({ SimpleTree:function(options){ //初始化参数 var option = $.extend({ click:function(a){ } },options); option.tree=this; /* 在参数对象中添加对当前菜单树的引用,以便在对象中使用该菜单树 */ option._init=function(){ /* * 初始化菜单展开状态,以及分叉节点的样式 */ this.tree.find("ul ul").hide(); /* 隐藏所有子级菜单 */ this.tree.find("ul ul").prev("li").removeClass("open"); /* 移除所有子级菜单父节点的 open 样式 */ this.tree.find("ul ul[show='true']").show(); /* 显示 show 属性为 true 的子级菜单 */ this.tree.find("ul ul[show='true']").prev("li").addClass("open"); /* 添加 show 属性为 true 的子级菜单父节点的 open 样式 */ }/* option._init() End */ /* 设置所有超链接不响应单击事件 */ this.find("a").click(function(){ $(this).parent("li").click(); return false; }); /* 菜单项 接受单击 */ this.find("li").click(function(){ /* * 当单击菜单项 * 1.触发用户自定义的单击事件,将该 标签中的第一个超链接做为参数传递过去 * 2.修改当前菜单项所属的子菜单的显示状态(如果等于 true 将其设置为 false,否则将其设置为 true) * 3.重新初始化菜单 */ option.click($(this).find("a")[0]); /* 触发单击 */ /* * 如果当前节点下面包含子菜单,并且其 show 属性的值为 true,则修改其 show 属性为 false * 否则修改其 show 属性为 true */ /* if($(this).next("ul").attr("show")=="true"){ $(this).next("ul").attr("show","false"); }else{ $(this).next("ul").attr("show","true"); }*/ /* 初始化菜单 */ option._init(); }); /* 设置所有父节点样式 */ this.find("ul").prev("li").addClass("folder"); /* 设置节点“是否包含子节点”属性 */ this.find("li").find("a").attr("hasChild",false); this.find("ul").prev("li").find("a").attr("hasChild",true); /* 初始化菜单 */ option._init(); }/* SimpleTree Function End */ }); });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值