项目代码第10讲【数据库运维知识——如何优化数据库查询效率?】:各种日志查看;主从复制;分库分表(MyCat);读写分离;区别数据分区、分表、分库
01. 运维-课程介绍_哔哩哔哩_bilibili
一、各种日志查看
二、分区
MySQL分区_哔哩哔哩_bilibili
1、什么是表分区?为什么要对表进行分区?
2、基本分区类型
1>RANGE分区:项目用的就是RANGE分区
2>LIST分区
3>LINEAR HASH分区
线性哈希分区旨在最小化数据迁移,而常规哈希分区则可能需要更多的数据重组织。
4>KEY分区(使用机率小)
与HASH分区不同的是,KEY分区使用的哈希函数是由MySQL服务器内部提供的,而不是用户自定义的表达式。
5>多列分区
6>子分区:分区表中每个分区的再次分割
在MySQL中,子分区通常与范围(RANGE)或列表(LIST)分区结合使用,并且子分区本身通常是基于哈希(HASH)或线性哈希(LINEAR HASH)进行的。
2》子分区案例:将每个子分区保存在不同的存储(硬盘)上,优化I/O性能
《1》创建abcd四个目录,如下图
《2》假设将四块硬盘分别挂接到abcd目录下,此步省略
《3》创建两个分区,每个分区里有两个子分区
3》子分区语法要求
3、分区管理
1>简单修改分区:生产环境中切忌贸然修改分区!
生产环境中切忌贸然修改分区:
背后需要大量的I/O读写时间。而且这个语句会阻塞DML语句,在这个期间对表不能读写。
2>RANG&LIST分区之删除指定分区
3>RANG&LIST分区之增加分区
1》RANGE分区
在MySQL中,RANGE分区表的新增分区只能添加到现有分区序列的后面,而不能直接添加到前面。
虽然MySQL不支持直接在RANGE分区表的前面添加分区,但可以通过REORGANIZE PARTITION或重建表的方式间接实现。
2》LIST分区
4>重组REORGANIZE PARTITION:生产环境中切忌贸然重组!
把数据全部读出来一遍,又写入一遍,背后需要大量的I/O读写时间。而且这个语句会阻塞DML语句,在这个期间对表不能读写。
“必须覆盖原有分区”:原有分区里的那些数据必须要有地方放
三、主从复制
四、分库分表(MyCat)
五、读写分离
六、区别数据分区、分表、分库
1、数据库分区
上图中的ibd文件,是分区表的数据文件,可以分布在不同的物理设备上(存放在不同硬盘上,见1>2》),从而高效地利用多个硬件设备
作用:如下图,在查询的时候缩小了磁盘的扫描范围
1>分区表的优势
1》逻辑上是一个事务,无需额外干涉:
跨多表操作时和单表操作是一样的。底层的数据一致性是由数据库自己保证的。
2》分区表的数据就是:上上(上)图的ibd文件,可以把数据存储分布在不同的硬盘上——>可并行的硬盘IO资源
这点也有劣势,如下2>
2>分区表的劣势
1》可并行的硬盘IO资源(见1>2》)设备计算资源与内存资源无法突破单体极限:作为计算节点,CPU和内存资源都是在单机上完成的
分区表的数据操作(如查询、更新等)尽管可以在逻辑上分开处理,但最终这些操作还是需要在单一计算节点上执行。
这意味着CPU和内存资源受限于该节点的硬件限制。
如果某个操作不能有效地被分散到多个节点或者分区中去,并且需要大量的计算资源或内存,那么这个操作的性能将会受到所在单机的硬件能力的限制。
2》【在设计前很难知道需要分区,所以这里也是一个限制】查询必须包含分区键,且分区键必须是主键的一部分,分区键必须是整数列或解析为整数的表达式。
举例:
《1》创建下述opr表,主键只有opr_no,没有包含分区键opr_data
代码报错,要求分区键必须是主键的一部分
《2》解决《1》:添加分区键opr_data为主键的一部分
3>实际架构设计原则:不要过分依赖数据库或某个组件自带的特性,要完成一个相对通性的设计——从而引出数据分表
2、数据分表
1>范围分表
2>Hash分表
可以解决数据不均衡的问题,但是当新增一个结点的时候,n就会从3变成4,就会进行全局数据的迁移工作。这个风险就太大了。
所以针对Hash分表的时候一开始就会给足资源,或者进行局部数据的迁移和调整。