
MySql数据库
我以为心都空了
嘿嘿
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
65.进阶-锁-全局锁-介绍
全局锁就是对整个数据库实例加锁,加锁后整个实例就处于只读状态,后续的DML的写语句,DDL语句,已经更新操作的事务提交语句都将被阻塞。其典型的使用场景是做全库的逻辑备份,对所有的表进行锁定,从而获取一致性视图,保证数据的完整性。为什么全库逻辑备份,就需要加全就锁呢?A. 我们一起先来分析一下不加全局锁,可能存在的问题。假设在数据库中存在这样三张表: tb_stock 库存表,tb_order 订单表,tb_orderlog 订单日志表。在进行数据备份时,先备份了tb_stock库存表。原创 2024-07-10 12:07:27 · 455 阅读 · 0 评论 -
64.进阶-锁-介绍
锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。MySQL中的锁,按照锁的粒度分,分为以下三类:全局锁:锁定数据库中的所有表。表级锁:每次操作锁住整张表。行级锁:每次操作锁住对应的行数据。原创 2024-07-10 12:03:29 · 195 阅读 · 0 评论 -
63.进阶-视图&存储过程&触发器-小结
1、视图(View)虚拟存在的表,不保存数据,值保存查询的SQL逻辑简单、安全、数据独立2、存储过程(Procedure)实现定义并存储在数据库中的一段SQL语句的集合减少网络交互,提高性能,封装重用变量、if、case、参数(in/out/inout)、while、repeat、loop、cursor、handler3、存储函数(FUNCTION)存储函数是有返回值的存储过程,参数类型只能为IN类型存储函数可以被存储过程替代4、触发器(TRIGGER)原创 2024-07-10 12:02:53 · 160 阅读 · 0 评论 -
62.进阶-触发器-案例3(delete类型)
测试完毕之后,检查日志表中的数据是否可以正常插入,以及插入数据的正确性。C. 删除数据触发器。原创 2024-07-10 12:02:17 · 208 阅读 · 0 评论 -
61.进阶-触发器-案例2(update类型)
测试完毕之后,检查日志表中的数据是否可以正常插入,以及插入数据的正确性。B. 修改数据触发器。原创 2024-07-10 12:01:39 · 294 阅读 · 0 评论 -
60.进阶-触发器-案例1(insert类型)
通过触发器记录 tb_user 表的数据变更日志,将变更日志插入到日志表user_logs中, 包含增加,修改 , 删除;测试完毕之后,检查日志表中的数据是否可以正常插入,以及插入数据的正确性。A. 插入数据触发器。原创 2024-07-10 12:01:05 · 242 阅读 · 0 评论 -
59.进阶-触发器-介绍
触发器是与表有关的数据库对象,指在insert/update/delete之前(BEFORE)或之后(AFTER),触发并执行触发器中定义的SQL语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性, 日志记录 , 数据校验等操作。使用别名OLD和NEW来引用触发器中发生变化的记录内容,这与其他的数据库是相似的。现在触发器还只支持行级触发,不支持语句级触发。行级触发器:当我们执行一条update语句,它影响了五行,那么这个时候触发器会被触发五次。原创 2024-07-10 12:00:30 · 224 阅读 · 0 评论 -
58.进阶-存储函数
READS SQL DATA:包含读取数据的语句,但不包含写入数据的语句。存储函数是有返回值的存储过程,存储函数的参数只能是IN类型的。 DETERMINISTIC:相同的输入参数总是产生相同的结果。 NO SQL :不包含 SQL 语句。计算从1累加到n的值,n为传入的参数值。原创 2024-07-10 11:59:51 · 179 阅读 · 0 评论 -
57.进阶-存储过程-条件处理程序-handler
根据传入的参数uage,来查询用户表tb_user中,所有的用户年龄小于等于uage的用户姓名(name)和专业(profession),并将用户的姓名和专业插入到所创建的一张新表(id,name,profession)中。我们继续来完成在上一小节提出的这个需求,并解决其中的问题。. 通过SQLSTATE的代码简写方式 NOT FOUND。02 开头的状态码,代码简写为 NOT FOUND。A. 通过SQLSTATE指定具体的状态码。原创 2024-07-10 11:59:21 · 163 阅读 · 0 评论 -
56.进阶-存储过程-游标-cursor
根据传入的参数uage,来查询用户表tb_user中,所有的用户年龄小于等于uage的用户姓名(name)和专业(profession),并将用户的姓名和专业插入到所创建的一张新表(id,name,profession)中。上述的存储过程,最终我们在调用的过程中,会报错,之所以报错是因为上面的while循环中,并没有退出条件。上述的功能,虽然我们实现了,但是逻辑并不完善,而且程序执行完毕,获取不到数据,数据库还报错。述的功能,虽然我们实现了,但是逻辑并不完善,而且程序执行完毕,获取不到数据,数据库还报错。原创 2024-07-10 11:58:49 · 517 阅读 · 0 评论 -
55.进阶-存储过程-循环-loop
上述语法中出现的 begin_label,end_label,label 指的都是我们所自定义的标记。LOOP 实现简单的循环,如果不在SQL逻辑中增加退出循环的条件,可以用其来实现简单的死循环。ITERATE:必须用在循环中,作用是跳过当前循环剩下的语句,直接进入下一次循环。计算从1到n之间的偶数累加的值,n为传入的参数值。计算从1累加到n的值,n为传入的参数值。LEAVE :配合循环使用,退出循环。原创 2024-07-10 11:58:18 · 412 阅读 · 0 评论 -
54.进阶-存储过程-循环-repeat
repeat是有条件的循环控制语句, 当满足until声明的条件的时候,则退出循环。计算从1累加到n的值,n为传入的参数值。(使用repeat实现)原创 2024-07-10 11:57:43 · 155 阅读 · 0 评论 -
53.进阶-存储过程-循环-while
while 循环是有条件的循环控制语句。满足条件后,再执行循环体中的SQL语句。计算从1累加到n的值,n为传入的参数值。原创 2024-07-09 17:09:50 · 469 阅读 · 0 评论 -
52.进阶-存储过程-case
case结构及作用,和我们在基础篇中所讲解的流程控制函数很类似。注意:如果判定条件有多个,多个条件之间,可以使用 and 或 or 进行连接。根据传入的月份,判定月份所属的季节(要求采用case结构)。10-12月份,为第四季度。1-3月份,为第一季度。4-6月份,为第二季度。7-9月份,为第三季度。原创 2024-07-09 17:07:30 · 169 阅读 · 0 评论 -
51.进阶-存储过程-参数(IN、OUT、INOUT)
参数的类型,主要分为以下三种:IN、OUT、INOUT。score >= 60分 且 score < 85分,等级为及格。根据传入参数score,判定当前分数对应的分数等级,并返回。的200分制的分数,进行换算,换算成百分制,然后。score >= 85分,等级为优秀。score < 60分,等级为不及格。原创 2024-07-09 17:07:00 · 447 阅读 · 0 评论 -
50.进阶-存储过程-if判断
上述的需求我们虽然已经实现了,但是也存在一些问题,比如:score 分数我们是在存储过程中定义死的,而且最终计算出来的分数等级,我们也仅仅是最终查询展示出来而已。那么我们能不能,把score分数动态的传递进来,计算出来的分数等级是否可以作为返回值返回呢?答案是肯定的,我们可以通过接下来所讲解的 参数 来解决上述的问题。在if条件判断的结构中,ELSE IF 结构可以有多个,也可以没有。根据定义的分数score变量,判定当前分数对应的分数等级。score >= 85分,等级为优秀。原创 2024-07-09 17:06:13 · 270 阅读 · 0 评论 -
49.进阶-存储过程-变量-局部变量
局部变量 是根据需要定义的在局部生效的变量,访问之前,需要DECLARE声明。可用作存储过程内的局部变量和输入参数,局部变量的范围是在其内声明的BEGIN …变量类型就是数据库字段类型:INT、BIGINT、CHAR、VARCHAR、DATE、TIME等。原创 2024-07-09 17:05:43 · 230 阅读 · 0 评论 -
48.进阶-存储过程-变量-用户定义变量
用户定义变量 是用户根据需要自己定义的变量,用户变量不用提前声明,在用的时候直接用 “@变量名” 使用就可以。其作用域为当前连接。1). 赋值赋值时,可以使用 = ,也可以使用 :=。推荐使用:=。因为在mysql中比较运算符也是=,没有==。所以在mysql当中,这个=既可以作为赋值运算符,又可以作为比较运算符。为了区分,推荐在赋值的时候使用:=SELECT 字段名 INTO @var_name FROM 表名;2). 使用。原创 2024-07-09 17:05:07 · 417 阅读 · 0 评论 -
47.进阶-存储过程-变量-系统变量
系统变量 是MySQL服务器提供,不是用户定义的,属于服务器层面。分为全局变量(GLOBAL)、会话变量(SESSION)。在MySQL中变量分为三种类型: 系统变量、用户定义变量、局部变量。1). 查看系统变量。2). 设置系统变量。原创 2024-07-09 17:04:37 · 219 阅读 · 0 评论 -
46.进阶-存储过程-基本语法
【代码】46.进阶-存储过程-基本语法。原创 2024-07-09 17:04:06 · 259 阅读 · 0 评论 -
45.进阶-存储过程-介绍
存储过程是事先经过编译并存储在数据库中的一段 SQL 语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。特点:封装,复用 -----------------------> 可以把某一业务SQL封装在存储过程中,需要用到的时候直接调用即可。可以接收参数,也可以返回数据 --------> 再存储过程中,可以传递参数,也可以接收返回值。原创 2024-07-09 17:03:28 · 408 阅读 · 0 评论 -
44.进阶-视图-案例
1). 为了保证数据库表的安全性,开发人员在操作tb_user表时,只能看到的用户的基本字段,屏蔽手机号和邮箱两个字段。2). 查询每个学生所选修的课程(三张表联查),这个功能在很多的业务中都有使用到,为了简化操作,定义一个视图。原创 2024-07-09 17:01:29 · 422 阅读 · 0 评论 -
43.进阶-视图-更新及作用
视图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作每次指定全部的条件。要使视图可更新,视图中的行与基础表中的行之间必须存在一对一的关系。数据库可以授权,但不能授权到数据库特定行和特定的列上。通过视图用户只能查询和修改他们所能见到的数据。A. 聚合函数或窗口函数(SUM()、 MIN()、 MAX()、 COUNT()等)上述的视图中,就只有一个单行单列的数据,如果我们对这个视图进行更新或插入的,将会报错。原创 2024-07-09 17:00:58 · 396 阅读 · 0 评论 -
42.进阶-视图-检查选项(local)
比如,v2视图是基于v1视图的,如果在v2视图创建的时候指定了检查选项为 local ,但是v1视图创建时未指定检查选项。则在执行检查时,知会检查v2,不会检查v2的关联视图v1。原创 2024-07-09 17:00:27 · 360 阅读 · 0 评论 -
41.进阶-视图-检查选项(cascaded)
当使用WITH CHECK OPTION子句创建视图时,MySQL会通过视图检查正在更改的每个行,例如 插入,更新,删除,以使其符合视图的定义。MySQL允许基于另一个视图创建视图,它还会检查依赖视图中的规则以保持一致性。比如,v2视图是基于v1视图的,如果在v2视图创建的时候指定了检查选项为 cascaded,但是v1视图创建时未指定检查选项。则在执行检查时,不仅会检查v2,还会级联检查v2的关联视图v1。原创 2024-07-09 16:59:52 · 212 阅读 · 0 评论 -
40.进阶-视图-介绍及基本语法
视图(View)是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。通俗的讲,视图只保存了查询的SQL逻辑,不保存查询结果。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。原创 2024-07-09 16:59:20 · 401 阅读 · 0 评论 -
39.进阶-SQL优化-小结
1、插入数据insert:批量插入,手动控制事务、主键顺序插入大批量插入:load data local infile2、主键优化主键长度尽可能短、顺序插入 AUTO_INCREMENT UUID(×)3、order byusing index:直接通过索引返回数据,性能高using filesort:需要将返回的结果在排序缓冲区排序4、group by优化索引,多字段分组满足最左前缀法则5、limit优化覆盖索引 + 子查询6、count优化。原创 2024-07-09 16:58:50 · 423 阅读 · 0 评论 -
38.进阶-SQL优化-update优化(避免行锁升级为表锁)
根据我们之前的分析,窗口1锁住的是na=“PHP”的这行数据,窗口二更新的是id为4的数据,应该是可以成功的,但是没有成功。我们提到对于InnoDB引擎当前默认事务隔离级别来说,我们在进行操作的时候,执行了一条update语句,当前他会把id为1的数据锁住,加的是行锁,只要你事务没提交,这个行锁就不会释放。另一个窗口也根据id修改数据,能执行成功,因为窗口1锁的是id为1的数据,窗口二操作的是id为4的数据,索引能操作成功。在InnoDB的引擎当中,行锁是针对索引加的锁,不是针对记录加的锁。原创 2024-07-07 16:55:10 · 556 阅读 · 0 评论 -
37.进阶-SQL优化-count优化
在之前的测试中,我们发现,如果数据量很大,在执行count操作时,是非常耗时的。MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行 count(*) 的时候会直接返回这个数,效率很高;但是如果是带条件的count,MyISAM也慢。InnoDB 引擎就麻烦了,它执行 count(*) 的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数。原创 2024-07-07 16:54:39 · 384 阅读 · 0 评论 -
36.进阶-SQL优化-limit优化
因为,当在进行分页查询时,如果执行 limit 2000000,10 ,此时需要MySQL排序前2000010 记录,仅仅返回 2000000 - 2000010 的记录,其他记录丢弃,查询排序的代价非常大。优化思路: 一般分页查询时,通过创建 覆盖索引 能够比较好地提高性能,可以通过覆盖索引加子查询形式进行优化。在数据量比较大时,如果进行limit分页查询,在查询时,越往后,分页查询效率越低。通过测试我们会看到,越往后,分页查询效率越低,这就是分页查询的问题所在。原创 2024-07-07 16:53:54 · 315 阅读 · 0 评论 -
35.进阶-SQL优化-group by优化
我们发现,如果仅仅根据age分组,就会出现 Using temporary;原因是因为对于分组操作,在联合索引中,也是符合最左前缀法则的。然后,我们在针对于 profession , age, status 创建一个联合索引。B. 分组操作时,索引的使用也是满足最左前缀法则的。B. 分组操作时,索引的使用也是满足最左前缀法则的。分组操作,我们主要来看看索引对于分组操作的影响。紧接着,再执行前面相同的SQL查看执行计划。A. 在分组操作时,可以通过索引来提高效率。时,可以通过索引来提高效率。原创 2024-07-07 16:53:23 · 316 阅读 · 0 评论 -
34.进阶-SQL优化-order by优化
也出现 Using index, 但是此时Extra中出现了 Backward index scan,这个代表反向扫描索引,因为在MySQL中我们创建的索引,默认索引的叶子节点是从小到大排序的,而此时我们查询排序时,是从大到小,所以,在扫描时,就是反向扫描,就会出现 Backward index scan。因为创建索引时,如果未指定顺序,默认都是按照升序排序的,而查询时,一个升序,一个降序,此时就会出现Using filesort。F. 根据phone,age进行升序排序,phone在前,age在后。原创 2024-07-07 16:52:52 · 995 阅读 · 0 评论 -
33.进阶-SQL优化-主键优化
首先需要明确,我们刚刚提到的Page页,页当中存放的就是具体的行数据。再去看下一个数据页,会发现还有50%以上都是空闲的,所以2号和3号这两个谁也,InnoDB引擎会自动合并,会将三号数据页中的记录移动到2号数据页,此时3号数据页就贡献出来了。InnoDB的逻辑存储结构最外层是表空间Tablespace,表空间中存储的是一个一个的Segment段,段里面存放的是一个一个的Extent区,而一个区的大小是固定的1M,在区当中存放的是一个一个的页Page,页当中存放的是一个一个的行,行当中存放具体的字段值。原创 2024-07-07 16:52:18 · 1019 阅读 · 0 评论 -
32.进阶-SQL优化-插入数据
解释:mysql中的事务默认是自动提交的,也就意味了当你执行完了一条sql,他就提交了,再执行一条,执行之前开启事务,执行完毕之后自动提交事务,这个时候就会设计到频繁的事务开启与提交,所以建议手动控制事务。我们会发现:使用load指令在加载本地文件的到数据库表的时候,本地文件里面写的并不是sql语句,而是符合一定规则的文件。如果一次性需要插入大批量数据(比如: 几百万的记录),使用insert语句插入性能较低,此时可以使用MySQL数据库提供的load指令进行插入。主键顺序插入,性能要高于乱序插入。原创 2024-07-07 16:51:32 · 428 阅读 · 0 评论 -
31.进阶-索引-小结
索引是高效获取数据的数据结构;原创 2024-07-07 16:50:52 · 298 阅读 · 0 评论 -
30.进阶-索引-使用原则
解释:比如一篇文章,直接构建索引,索引的体积非常庞大,在查询的时候会浪费大量的磁盘IO。5). 尽量使用联合索引,减少单列索引,查询时,联合索引很多时候可以覆盖索引,节省存储空间,避免回表,提高查询效率。6). 要控制索引的数量,索引并不是多多益善,索引越多,维护索引结构的代价也就越大,会影响增删改的效率。3). 尽量选择区分度高的列作为索引,尽量建立唯一索引,区分度越高,使用索引的效率越高。4). 如果是字符串类型的字段,字段的长度较长,可以针对于字段的特点,建立前缀索引。解释:注意最左前缀法则哦。原创 2024-07-07 16:50:19 · 329 阅读 · 0 评论 -
29.进阶-索引-使用规则-单列&联合索引
因为我们查询返回的只是id,phone和name,这三个字段的值在联合索引中都有,走这一个获取到的已经满足需求了,所以不需要回表查询。通过上述执行计划我们可以看出来,在and连接的两个字段 phone、name上都是有单列索引的,但是最终mysql只会选择一个索引,也就是说,只能走一个字段的索引,此时是会回表查询的。此时,查询时,就走了联合索引,而在联合索引中包含 phone、name的信息,在叶子节点下挂的是对应的主键id,所以查询是无需回表查询的。在查询出来的索引中,既有单列索引,又有联合索引。原创 2024-07-07 16:49:44 · 424 阅读 · 0 评论 -
28.进阶-索引-使用规则-前缀索引
因为刚才在对比的时候,只是对比了前缀,拿到这一行的前缀,我要从这一行的数据中拿出email的值,然后再去看这一行的数据email的值是不是我所传递进来的email。如果不是,直接返回前面查询到的数据就行了,如果是,接下来还需要再去查询这一行的数据,再把这一行的数据也拿到,最终组装数据并返回。可以根据索引的选择性来决定,而选择性是指不重复的索引值(基数)和数据表的记录总数的比值,索引选择性越高则查询效率越高, 唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的。3). 前缀索引的查询流程。原创 2024-07-07 16:49:14 · 294 阅读 · 0 评论 -
27.进阶-索引-使用规则-覆盖索引-回表查询
因为,在tb_user表中有一个联合索引 idx_user_pro_age_sta,该索引关联了三个字段profession、age、status,而这个索引也是一个二级索引,所以叶子节点下面挂的是这一行的主键id。虽然是根据name字段查询,查询二级索引,但是由于查询返回在字段为 id,name,在name的二级索引中,这两个值都是可以直接获取到的,因为覆盖索引,所以不需要回表查询,性能高。由于在name的二级索引中,不包含gender,所以,需要两次索引扫描,也就是需要回表查询,性能相对较差一点。原创 2024-07-07 16:48:28 · 702 阅读 · 0 评论 -
26.进阶-索引-使用规则-SQL提示
测试结果,我们可以看到,possible_keys中 idx_user_pro_age_sta,idx_user_pro 这两个索引都可能用到,最终MySQL选择了idx_user_pro_age_sta索引。B. 执行SQL,创建profession的单列索引:create index idx_user_pro on tb_user(profession);接下来,介绍一下SQL提示。SQL提示,是优化数据库的一个重要手段,简单来说,就是在SQL语句中加入一些人为的提示来达到优化操作的目的。原创 2024-07-07 16:47:38 · 395 阅读 · 0 评论