【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


索引设计原则

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/901447.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试篇 - GPT-1(Generative Pre-Training 1)

GPT-1(Generative Pre-Training 1) ⭐模型结构 Transformer only-decoder:GPT-1模型使用了一个12层的Transformer解码器。具体细节与标准的Transformer相同,但位置编码是可训练的。 注意力机制: 原始Transformer的解…

ubuntu24.04 cmake 报错 libldap-2.5.so.0 解决办法

apt cmake有毛病 换源重新安装 wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | sudo apt-key add - sudo apt-add-repository "deb https://apt.kitware.com/ubuntu/ $(lsb_release -cs) main" sudo apt update sudo apt in…

ScholarCopilot:“学术副驾驶“

这里写目录标题 引言:学术写作的痛点与 AI 的曙光ScholarCopilot 的核心武器库:智能生成与精准引用智能文本生成:不止于“下一句”智能引用管理:让引用恰到好处 揭秘背后机制:检索与生成的动态协同快速上手&#xff1a…

vivo X200 Ultra前瞻系列(2):vivo X200 Ultra影像技术沟通会总结

vivo于今日(2025年4月14日)举办的“X系列蓝图影像技术沟通会”中,正式发布了vivo X200 Ultra,展示了其在移动影像领域的多项技术突破。以下是本次沟通会的核心内容总结: 1. 硬件革新:蔡司三焦段镜头与双芯架构 蔡司三大定焦大师镜头: X200 Ultra采用14mm超广角(“鹰眼”…

代码随想录第17天:二叉树

一、二叉搜索树的最近公共祖先(Leetcode 235) 由于是二叉搜索树,节点的值有严格的顺序关系:左子树的节点值都小于父节点,右子树的节点值都大于父节点。利用这一点,可以在树中更高效地找到最低公共祖先。 c…

C++中string库常用函数超详细解析与深度实践

目录 一、引言 二、基础准备:头文件与命名空间 三、string对象的创建与初始化(基础) 3.1 直接初始化 3.2 动态初始化(空字符串) 3.3 基于字符数组初始化 3.4 重复字符初始化 四、核心函数详解 4.1 字符串长度相关 4.1.1 …

LanDiff:赋能视频创作,语言与扩散模型的融合力量

自从 Wan 2.1 发布以来,AI 视频生成领域似乎进入了一个发展瓶颈期,但这也让人隐隐感到:“DeepSeek 时刻”即将到来!就在前几天,浙江大学与月之暗面联合推出了一款全新的文本到视频(T2V)生成模型…

【本地图床搭建】宝塔+Docker+MinIO+PicGo+cpolar:打造本地化“黑科技”图床方案

写在前面:本博客仅作记录学习之用,部分图片来自网络,如需引用请注明出处,同时如有侵犯您的权益,请联系删除! 文章目录 前言宝塔安装DockerMinIO 安装与设置cploar内网穿透PicGo下载与安装typora安装总结互动…

centos-LLM-生物信息-BioGPT-使用1

参考: GitHub - microsoft/BioGPT https://github.com/microsoft/BioGPT BioGPT:用于生物医学文本生成和挖掘的生成式预训练转换器 |生物信息学简报 |牛津学术 — BioGPT: generative pre-trained transformer for biomedical text generation and mini…

高效爬虫:一文掌握 Crawlee 的详细使用(web高效抓取和浏览器自动化库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Crawlee概述1.1 Crawlee介绍1.2 为什么 Crawlee 是网页抓取和爬取的首选?1.3 为什么使用 Crawlee 而不是 Scrapy1.4 Crawlee的安装二、Crawlee的基本使用2.1 BeautifulSoupCrawler的使用方式2.2 ParselCrawler的使…

架构总览怎么写,才算工业级?

📈系统架构文档是整个项目最重要的起点,但很多人第一章就“写穿了”: 不是写得太细,就是没有重点。想要写出高质量、能协作、能传承的架构文档,这一篇会告诉你应该怎么做—— ✅ 架构总览的终极目标 明确边界、定义角色、画清数据流 别讲执行细节,别深入函数调用。 ✅ 架…

优先级队列(堆二叉树)底层的实现:

我们继续来看我们的优先级队列: 优先级队列我们说过,他也是一个容器适配器,要依赖我们的容器来存储数据; 他的第二个参数就是我们的容器,这个容器的默认的缺省值是vector,然后他的第三个参数,我…

GIC驱动程序分析

今天呢,我们就来具体的讲一下GIC的驱动源码啦,这个才是重点来着,我们来看看: GIC中的重要函数和结构体: 沿着中断的处理流程,GIC涉及这4个重要部分: CPU从异常向量表中调用handle_arch_irq&am…

java操作redis库,开箱即用

application.yml spring:application:name: demo#Redis相关配置redis:data:# 地址host: localhost# 端口,默认为6379port: 6379# 数据库索引database: 0# 密码password:# 连接超时时间timeout: 10slettuce:pool:# 连接池中的最小空闲连接min-idle: 0# 连接池中的最…

Cribl 通过Splunk search collector 来收集数据

今天利用Spliunk search collector 来收集数据啦:还是要先cribl 的官方文档: Splunk Search Collector | Cribl Docs Splunk Search Collector Cribl Stream supports collecting search results from Splunk queries. The queries can be both simple and complex, as well a…

What Was the “Game Genie“ Cheat Device, and How Did It Work?

什么是“Game Genie”作弊装置,它是如何工作的? First released in 1991, the Game Genie let players enter special codes that made video games easier or unlocked other functions. Nintendo didnt like it, but many gamers loved it. Heres wha…

位运算题目:连接连续二进制数字

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题:连接连续二进制数字 出处:1680. 连接连续二进制数字 难度 5 级 题目描述 要求 给定一个整数 n \texttt{n} n,将 1 \text…

第十六届蓝桥杯Java b组(试题C:电池分组)

问题描述: 输入格式: 输出格式: 样例输入: 2 3 1 2 3 4 1 2 3 4 样例输出: YES NO 说明/提示 评测用例规模与约定 对于 30% 的评测用例,1≤T≤10,2≤N≤100,1≤Ai​≤10^3。对于 100…

63. 评论日记

2025年4月14日18:53:30 雷军这次是真的累了_哔哩哔哩_bilibili

电商中的订单支付(内网穿透)

支付页面 接口文档 Operation(summary"获取订单信息") GetMapping("auth/{orderId}") public Reuslt<OrderInfo> getOrderInfo(Parameter(name"orderId",description"订单id",requiredtrue) PathVaariable Long orderId){OrderI…