- 博客(21)
- 收藏
- 关注
原创 6_3、大数据量时如何进行DDL操作
修改表结构(如添加字段、添加索引)会给数据表加表级锁,当表中数据量较大时,会导致阻塞时间很长。那么对于数据量大的表,如何在线修改表结构呢?一、方法一–滚动升级停掉mysql服务器来修改表结构,然后进行滚动式更新:1、比如很多台mysql服务器,先把主服务器停掉来更新(一般多台主服务器,让其他主服务器提供服务)2、等到更新完,就滚动到从服务器(在此之前是其他从服务器提供服务的)这种方案必须能够停掉mysql服务器来修改字段,mysql服务器越多,就需要的时间越长,只有等到更新完毕,才能把部署上线新
2022-04-04 17:56:22
2913
原创 9_4、sql优化--select语句
一、group by优化1、使用索引优化;2、group by使用索引时,explain-extra值为Using index ,未使用索引或索引失效,explain-extra值为Using temporary 。二、order by优化1、使用索引优化;2、order by使用索引时,explain-extra值为Using index ;未使用索引或索引失效,explain-extra值为Using filesort 。三、 limit优化1、使用索引优化**当一个表中有几百万的数
2022-04-01 15:59:21
554
原创 9_3、sql优化--explain命令使用介绍
一、explian命令介绍explain命令可以用于查看select语句的执行计划,从而实现对select语句的性能进行分析。explain命令只能用于查看select语句的执行计划二、explian执行计划各字段介绍2.1 idid表示select语句执行顺序:1、id相同,执行顺序从上到下;id不同,值越大,越先执行 (子查询id会自增,优先执行子查询)。2、当select语句没有子查询、连接查询时,id值仅有一个;2.2 select_typeselect_type表示sele
2022-04-01 15:57:57
836
原创 9_2、sql优化--update语句
一、update/delete优化–>防止行锁升级为表锁假设我们有course 表,id为主键1、当我们在执行如下SQL语句时,会锁定id为1这一行的数据,然后事务提交之后,行锁释放。update course set name = 'javaEE' where id = 1 ;2、但是当我们在执行如下SQL时 ,由于where条件未使用索引,会导致行锁升级为表锁,导致性能低 update course set name = 'SpringBoot' where name = 'PHP'
2022-04-01 15:55:30
1039
原创 9_1、sql优化--insert语句
如果我们需要一次性往数据库表中插入多条记录 ,可以从如下四方面进行优化一、批量插入//批量插入INSERT INTO book(name,price)VALUES('a',1),('b',2),('c',3);二、手动提交事务DML语句默认是自动提交事务的,改为手动提交可以避免多次提交,从而提升性能start transaction;insert into tb_test values(1,'Tom'),(2,'Cat'),(3,'Jerry');insert into tb_te
2022-04-01 15:53:47
1192
原创 8_3、mysql读写分离且分库分表
一、读写分离且分库分表实际项目中,可能既要读写分离、又要分库分表,该种场景的实现方式有2中:1、使用sharding-jdbc2、使用mycat简单来说,2种方式的区别是:1)mycat是一个中间件,使用mycat时不需要改代码;2)sharding-jdbc是一个jar包,使用sharding-jdbc时需要修改代码二、分库分表2.1 常见的拆分方式根据指定字段值取模:如id%3=0、1、2的分别分在0号、1号、2号库/表根据指定字段的数据范围:如id取值在0-500万、50
2022-03-19 00:23:51
881
原创 8_2、mysql读写分离及实现
一、读写分离读写分离基于主从复制二、读写分离实现方式2.1 方式一:mybatis-plus+dynamic-datasource多数据源1、使用没有@DS("dsName")注解指明使用哪个库,注解可以使用在service实现或mapper接口方法上;2、没有使用@DS则使用默认数据源3、dsName可以为组名也可以为具体某个库的名称4、写后立即读的问题,使用@DS强制走主库即可解决5、参考网址:https://www.lhsz.xyz/read/mybatis-plus-2.x/52b3
2022-03-19 00:20:34
1615
原创 8_1、mysql主从复制及实现
一、主从复制的作用1、实现读写分离,降低主库的访问压力。2、主库出现问题,可以快速切换到从库提供服务。3、可以在从库中执行备份,以避免备份期间影响主库服务(备份时会加全局锁,只能查不能改)。二、主从复制原理主从复制分成三步:Master 主库在事务提交时,会把DDL、DML变更记录在二进制日志文件 Binlog 中。从库读取主库的二进制日志文件 Binlog ,写入到从库的中继日志 Relay Log 。slave重做中继日志中的事件,对从库中数据、表结构进行变更。1、主从复制可以是
2022-03-19 00:16:56
357
原创 7_1、mysql本地事务
事务可以看作是一次重大的活动,它由不同的小活动组成,这些小活动要么全部成功,要么全部失败。操作单一数据库的事务,我们叫做本地事务。一、事务特性–ACID• 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。• 一致性(Consistency):事务执行前后,数据都保持正确。• 隔离性(Isolation):隔离性是指并发的两个事务的执行互不干扰,一个事务不能看到其他事务运行过程的中间状态。通过配置事务的隔离级别可以避免脏读、不可重复读、脏读问题。• 持久性(
2022-03-19 00:08:28
528
原创 6_2、锁的一道面试题
一、面试题目InnoDB中,下面六句sql在不同的事务隔离级别下:是否加锁,加的是共享锁还是排他锁,是否存在间隙锁?select * from table where id = ?select * from table where id < ?select * from table where id = ? lock in share modeselect * from table where id < ? lock in share modeselect * from table
2022-03-19 00:03:07
200
原创 6_1、事务前置知识--锁机制
一、mysql中锁的分类二、mysql中锁的按粒度分类MySQL中的锁,按照锁的粒度分,分为以下三类:1、全局锁:锁定数据库实例中的所有库、所有表。只能DQL不能DML,该锁用于数据库备份。2、表级锁:每次操作锁住整张表。锁定粒度大,发生锁冲突的概率最高,并发度最低3、行级锁:每次DML操作锁住对应的行数据 。行锁 锁定粒度小,发生锁冲突的概率最低,并发度高。InnoDB的数据是基于索引组织的,行级锁是通过对索引上的索引项加锁来实现的,而不是对记录加的锁,锁住了索引项相当于锁住了行数据;三
2022-03-18 23:54:04
304
原创 5_2、MVCC解决什么问题
并发读取数据,如果不加以控制(悲观锁、MVCC乐观锁),则会出现脏读、不可重复读、幻读问题,MVCC机制使用乐观锁,比悲观锁提高了读并发。一、脏读二、不可重复读三、幻读四、如何解决事务中读的3个问题–隔离级别针对事务中读的3个问题,mysql设置了如下4种事务隔离级别去解决(InnoDB默认使用可重复读):1、从开发者视角学习MYSQl系列文章:https://blog.youkuaiyun.com/maoxuemin/article/details/123523457;2、快速问答:https
2022-03-18 23:47:08
361
原创 5_1、事务前置知识--mvcc机制
一、MVCC概念MVCC全称 Multi-Version Concurrency Control(多版本并发控制),指维护一个数据的多个版本,是一种乐观锁。作用是:在使用多线程并发读取数据时,使用乐观锁替代悲观锁从而提高读的性能。MVCC的具体实现,需要依赖于数据库记录中的三个隐式字段、undo log日志、readView(读快照)。1.1 隐藏字段当我们创建一张表时,InnoDB还会自动的给我们添加三个隐藏字段:1.2 undolog 版本链在DML操作时,mysql会先将数据加载到内存,
2022-03-16 14:51:47
1310
原创 从开发者视角学习MYSQl系列文章
第一章 基础部分 (开发参考手册)1_1、mysql基础--DDL1_2、mysql基础--DDL--约束2_1、mysql基础--DML3_1、mysql基础--DQL--单表3_2、mysql基础--DQL--多表第二章 原理部分4_1、索引
2022-03-16 12:42:52
127
原创 4_2、mysql架构体系
一、mysql架构体系[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4McSQzbS-1647361433505)(.\images\18.png)]1.1 连接层负责与客服端的连接处理、授权认证等。连接使用线程池。1.2 服务层跨存储引擎的功能在这一层实现:解析、优化SQL语句形成执行计划,通过SQL接口与存储引擎交互。1.3 引擎层1、存储引擎负责了组织MySQL中数据的存储和提取 ,不同的存储引擎具有不同的功能。2、常见存储引擎对比[外链图片转存失败,
2022-03-16 00:24:01
484
原创 4_1、索引
一、索引的数据结构1.1 索引的数据结构选型索引的作用是提升数据查询速度,可选的数据结构有:hash优点:只需一次hash计算即可定位,所以插入、查询速度快缺点1:不支持范围查询缺点2:数据量大导致hash冲突多时,需要逐个遍历链表中元素,降低查询速度二叉树优点:对hash的缺点2进行了改进,可以降低遍历冲突链表次数缺点1:数据顺序插入时,又会变成链表结构;缺点2:数据量较大时,层级较深红黑树:通过左旋、右旋、变色,形成平衡二叉树解决了二叉树的缺点1,但数据量较大时,层级
2022-03-16 00:23:27
631
原创 3_2、mysql基础--DQL--多表
一、多表联合查询多表联合查询就是同时查询两个或两个以上的表。多表联合查询有如下分类:1.1 交叉连接查询【笛卡尔积】select * from A,B,...交叉连接查询可以理解为:一张表的每一行,连接另一张表的任意一行返回。加入A表有m行数据(k1列)、B表有n行数据(k2列),则总共返回m*n行数据(k1+k2列)。1.2 内连接语法一-->隐式内连接(SQL92标准):select * from A,B where 条件;语法二-->显示内连接(SQL99标准):selec
2022-03-16 00:20:38
123
原创 3_1、mysql基础--DQL--单表
一、DQLDQL指数据查询语言,用于数据查询1.1 DQL完整语法select [all|distinct] <目标列的表达式1> [别名], <目标列的表达式2> [别名]...from <表名或视图名> [别名],<表名或视图名> [别名]...[where<条件表达式>][group by <列名> [having <条件表达式>]][order by <列名> [asc|de
2022-03-16 00:20:02
146
原创 2_1、mysql基础--DML
一、DMLDML(Data Manipulation Language)指数据操作语言,用来对数据表中的数据记录进行增/删/改操作,不包括数据查询//插入数据语法insert into 表 (列名1,列名2,列名3...) values (值1,值2,值3...); //向表中插入某些insert into 表 values (值1,值2,值3...); //向表中插入所有列//删除数据语法delete from 表名 [where 条件];//修改数据语法update 表名 s
2022-03-16 00:19:17
721
原创 1_2、mysql基础--DDL--约束
一、约束条件约束是指表中数据的限制条件。表在设计的时候加入约束的目的就是为了保证表中的记录完整性和有效性,比如:有些列的值不能为空的约束、有些列的值不能重复的约束。1.1 约束分类主键约束(primary key) PK自增长约束(auto_increment)非空约束(not null)唯一性约束(unique)默认约束(default)零填充约束(zerofill)外键约束(foreign key) FK二、主键约束MySQL主键约束是一个列或者多个列的组合,其值能唯一地标识
2022-03-16 00:18:35
483
原创 1_1、mysql基础--DDL
一、DDLDDL(Data Definition Language),数据定义语言,该部分语言用于对数据库、数据表的操作(不包括对表中数据记录的操作),具体包括:对数据库的操作对数据表的操作二、 对数据库的操作–【增/删/改/查/切换】操作DDL SQL创建数据库create database [if not exists] mydb1 [charset=utf8mb4]删除数据库drop database [if exists] mydb1;修改数据库编码
2022-03-16 00:16:48
135
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人