当前位置: 首页 > news >正文

【MySQL高级】事务,存储引擎,索引(一)

Mysql高级

DQL查询语句

反引号

image-20250414074629964

模糊查询避免%出现在开头,会造成索引失效

order by排序先后

image-20250413110219322

image-20250414072444951

表名列名都需要用${},他们不能带’’


去重+统计数量

image-20250413110318319

image-20250414072123779


null的运算

image-20250413110601023

分组函数会自动忽略null,不用对null进行处理


截取子串substr(字段,下标,截取长度)

下标从1开始

image-20250413110900025


trim去重字段空格

image-20250413111007763


now()

image-20250413111315490


分组函数和分组查询group by

image-20250413111907510

image-20250413111852126

image-20250413111923464

可以联合分组

image-20250413111947966


having和where区别和使用

having可以用分组函数,但是必须先group by 分组后再用having过滤

而where不可以用分组函数,必须先过滤后用group by 分组

image-20250413112712140

image-20250413112542748

where效率比having高

因为执行顺序,先where后group by 后 having

在这里插入图片描述
image-20250414071249539


连接查询

笛卡尔积,直接from 两张表,没有join和on条件(外键),直接n*n行查询,效率慢

image-20250414081954719

image-20250414070059519

执行顺序先from后select

on条件相等,一般为外键

image-20250414070157215

非等值查询


自连接

image-20250414070336657

外连接

image-20250414070450763

主次关系,需要把员工名全查出来,捎带查领导


多表连接

image-20250414070616777

子查询(select嵌套)

image-20250414072237104

where中子查询

image-20250414072251865

DML增删改语句

在这里插入图片描述
image-20250414073108558

image-20250414073143004


事务

事务的本质就是多条DML语句同时成功或者同时失败

image-20250414075348118

每一句DML语句都会储存在日志文件
提交事务commit或者回滚事务rollback,都会清空日志文件
commit提交到表中(硬盘中),rollback回滚到上次提交,都是结束事务的标志

事务的特性

image-20250414160539197


事务的隔离级别

image-20250414075901639

重复:同一事务中,对相同数据进行多次读取

不可重复读

image-20250414075928139

也就是事务先读取a,被别的事务修改了,再读取同一条记录,得到的结果不一样,所以不可重复读

在这里插入图片描述

每次读到的数据都一样,可重复读会给读取的数据加锁,其他事务无法修改这个数据

幻读就是第一次读取a,发现不存在,于是insert 这个a,发现insert失败,这时候就是另一个事务已经insert了这个a

但是第二次读取a,发现还是不存在,依旧insert失败,好像出现了幻觉

image-20250414080747798

单线程不能并发

image-20250414160641872


三范式

image-20250414080936943

第二范式

修改前(联合主键,部分依赖)

image-20250414081242181

修改后,三张表,关系表两个外键

image-20250414081227757

不能产生复合主键,部分依赖就是某个字段只依赖其中一个主键,和另一个主键没关系

多对多关系,需要设计三张表A表,B表,关系表

多对多,三张表,关系表两外键


第三范式

修改前(班级依赖01,01依赖1001)产生传递依赖

image-20250414081450268

修改后(多的表加外键)

image-20250414081522999

一对多,两张表,多的表加外键


大部分情况下,公司都不会遵循设计三范式

为了满足客户需求,速度要快的情况下,哥们不需要节省空间,有的是空间,不怕数据冗余
可以写在一张表内,就不会出现笛卡尔积现象

因为表与表连接次数越多,效率越慢


存储引擎

以表为单位的,同一个数据库不同表可以有多种不同的存储引擎

mysql体系结构

image-20250414160916253

索引在引擎层


InnoDB存储引擎

支持事务,行级锁,外键

在这里插入图片描述

表结构,数据,索引全部都在表空间文件.ibd中

8.0之后表结构从.frm----->.sdi

逻辑存储结构

image-20250414161500104


MyISAM(MongoDB)

image-20250414161612644

Memory(Redis)

image-20250414161658027

只有一个.sdi表结构数据在硬盘中,数据和索引都在内存中


image-20250414161830120

image-20250414162036597


索引

是一种优化后的B+ Tree数据结构

SQL优化都是根据索引来优化

image-20250414162335081

索引在引擎层实现

image-20250414162738550

image-20250414162815315


B树

二叉树

缺点:1.顺序插入形成单向链表

2.一个节点只能有两个子节点,数据量大时,层级较深,检索速度慢

image-20250414163030688

对于第一个问题,可以使用红黑树,自平衡,但是第二个问题不能解决

image-20250414163121743

B树(多路平衡查找树)(一个节点下可以有多个子节点,解决第二个问题),同样也是自平衡的

度数:树的度数指的是一个节点的子节点个数

image-20250414163429985

数据挂在key下面

B树插入规则

以5阶B树为例,最多四个key

image-20250414163633579 插入1200

插入后中间的数向上分裂(这里是345)

image-20250414163744566


B+树

image-20250414164309307

所有的元素都会出现在叶子节点中,上面的非叶子节点起到索引的作用,叶子节点是存放数据的

形成单向链表

B+树插入规则

image-20250414164350794 插入890

同样,567向上分裂,但是叶子节点也会有567,出现指针,形成单向链表

image-20250414164415634

image-20250414164516090

Mysql索引对B+树做了优化

在这里插入图片描述

叶子节点是双向链表,每一个节点都是存储在页中的


Hash索引数据结构

查询效率高(不发生哈希冲突的情况)

不支持范围查询和排序

在这里插入图片描述

image-20250414190913523

为什么InnoDB存储引擎使用B+树索引结构

image-20250414191152900

对于B树和B+树来说,每个节点都是存储在页page中,而page的大小是固定为16k的,所以对于B树来说,page中存储数据的话,会抢占key和指针的空间

key和指针减少,层级就会增多,导致性能降低


索引分类

image-20250414191615443

单列索引,联合索引都是常规索引

常规索引属于二级索引

image-20250414191641603

聚簇索引,叶子节点保存了整行数据

非聚簇索引,叶子节点保存的是对应的主键id,如果有常规索引,也会保存常规索引字段数据

image-20250414191826300

image-20250414191943348

回表

image-20250414192027477

先查arm 索引找到主键id,然后根据主键id再找到对应的一整行数据


性能调优

主要对于索引来优化查询语句

com后七个_

image-20250414193158497

看当前数据库是插入,更新,删除,谁为主

如果发现查询占主导,就需要进行sql优化


慢查询日志

image-20250414193403261


以上都是根据sql语句的执行时间来判断sql的性能,我们不能只看执行时间

explain 执行计划

image-20250414194219497

在这里插入图片描述

多表查询

image-20250414195347392

id相同,表结构执行顺序从上往下,先执行student,再执行连接表,最后执行course表

子查询(select嵌套)

image-20250414195507317

id不同,值越大越先执行,先执行最内层的表,一层层执行出去

image-20250414195831614


select_type意义不大,只说明当前sql的查询类型

image-20250414195845929


type

在这里插入图片描述

对于正常业务来说,const就是最好的了,NULL是不查表,system是查询系统表

where对主键和唯一索引查询一般是const和eq_ref,对于非唯一性索引一般是ref

index虽然用了索引,但也是对索引进行全表扫描,all是全表扫描


possible_key

在这里插入图片描述

显示可能用到的索引


key

image-20250414200520171

实际用到的索引


image-20250414200550429

image-20250414200714215

image-20250414200652642

返回条数和实际扫描条数占比,越大越好


索引的使用

最左前缀法则(联合索引)

image-20250414202126007

针对于联合索引,查询时从索引最左侧列(必须存在)开始,不跳过索引中间的列,如果跳过某一列,这一列后面的索引将会失效

创建联合索引

image-20250414201453568

profession,age,status,按顺序联合,profession是最左字段

image-20250414201719706

image-20250414201804934

表示status这个字段索引长度是5

在这里插入图片描述

表示age索引长度是2

image-20250414201922127

全表扫描,索引失效,因为没有最左字段

在这里插入图片描述

缺少中间字段,所以之后的索引部分失效,只走了profession的索引

和字段使用顺序无关,只要出现就行


范围查询(联合索引)

针对于联合索引

在这里插入图片描述

image-20250414202351104


索引失效情况

1.对索引列进行运算操作(函数substr等)

image-20250414202656377

2.字符串字段没有加’’

image-20250414203002035

3.头部模糊匹配,索引失效

image-20250414203153366

4.or前后字段都要有索引才会走索引,不然失效

image-20250414203338526

在这里插入图片描述

5.数据分布影响

有时候使用索引比全表扫描还慢,就不会使用索引

比如:当我们要一个条件把全表都查出来(或者表的绝大部分都是满足条件的),肯定走全表扫描比走索引快

is null (因为绝大部分都不是null,不满足)一般走索引

is not null(因为绝大部分都不是null,满足)一般不走索引

所以null要看表中数据绝大部分满不满足,如果满足,就不走,如果不满足,就走索引


SQL提示

可以给一个字段添加多个索引,比如联合索引和单列索引

mysql默认会执行联合索引(前提满足最左前缀法则)

可以指定来使用哪个索引
在这里插入图片描述

在这里插入图片描述

use index 只是一个建议,mysql可能不会用

force index 是必须用


覆盖索引

select返回的字段在索引列中都能找到,而不需要回表查询,这样的索引就是覆盖索引

尽量避免select *

image-20250414220344250

image-20250414220524614

测试

image-20250414220943814

对username和password加联合索引,就不需要回表了


前缀索引

image-20250414221207765

image-20250414221856000

前缀索引中,回表查询拿到row这一行的数据不会直接返回,而是会对比这条数据中前缀索引字段和select语句的字段是否一致,如果一致则返回结果,如果不一致,则顺着二级索引的链表继续查找下一个判断


单列和联合索引的选择

image-20250414222146055

一个字段可以有多个索引,比如自己的单列索引再加上和别人的联合索引

image-20250414222334732

mysql会评估哪个字段的索引效率更高,会选择改索引,也就是phone索引

此时在phone的单列索引中不包含name字段,所以会进行回表查询


我们给phone和name添加上联合索引后,还是使用的phone的单列索引(单列索引干扰),还是会回表

在这里插入图片描述

所以我们可以用sql提示(use index)来指定mysql使用联合索引

所以,如果存在多个查询条件,我们一般建立联合索引(覆盖索引,不会回表查询)


联合索引的数据结构

image-20250414223704692


索引设计原则

在这里插入图片描述

相关文章:

  • 2024年蓝桥杯第十五届CC++大学B组真题及代码
  • 罗庚机器人:机器人打磨领域的先行者
  • 基于Windows通过nginx代理访问Oracle数据库
  • 深入理解 PyTorch:从入门到精通的深度学习框架
  • 基于Oracle ADG通过dblink创建物化视图同步数据到目标库
  • spark-sql学习内容总结
  • Coze流搭建--写入飞书多维表格
  • DHCP简单例子
  • 旧版 VMware 虚拟机迁移至 KVM 平台-案例1
  • ThreeJs实现裸眼3D地球仪
  • 源代码加密之零日攻击
  • 算力云平台部署—SadTalker的AI数字人视频
  • java 递归遍历JSON字符串获取某个字段的值
  • Docker构建go-web应用
  • 视频孪生技术赋能矿山数字化升级转化
  • 【ROS2】行为树 BehaviorTree(四):组合使用子树
  • Flink DataStream API深度解析(Scala版):窗口计算、水位线与状态编程
  • 利用DevEco Profiler定位性能瓶颈,优化资源占用
  • C++性能优化实战:从瓶颈定位到高并发架构重构(第一章)
  • AI大模型赋能工业制造:智能工厂的全新跃迁路径
  • 构建菌株有效降解有机污染物,上海交大科研成果登上《自然》
  • 2025年上海市模范集体、劳动模范和先进工作者名单揭晓
  • 洞天寻隐·学林纪丨玉洞桃源:仇英青绿山水画中的洞天与身体
  • 进化版大巴黎通杀英超,那个男人后悔了吗
  • 4月外汇储备增加410亿美元,黄金储备连续6个月增加
  • 《中国医药指南》就“宫颈癌等论文出现男性病例”致歉:辞退涉事编辑