【进阶】MySQL高级篇超详讲解!!!

Mysql服务器内部架构(了解)

连接层

负责客户端的链接,验证账号密码等授权认证

服务层

对sql进行解析,优化,调用函数,如果是查询操作,有没有缓存等操作。

引擎层

是真正负责数据存储和提取的地方,mysql中提供多种引擎进行数据处理,可以根据需要进行数据选择

物理文件存储层

物理存储表数据,以及各种日志文件的地方

Mysql引擎

mysql中的引擎就是实际对数据操作的一种实施者,

不同的引擎的所使用的技术不同.

引擎种类:

SHOW ENGINES;

主要讲innodb和myisam

innodb引擎特点

是一个综合能力比较强的引擎,支持事务,行级锁,外键约束,全文索引,支持数据缓存等功能.

支持主键自增,不存储表的总行数(统计表的总行数,innodb中默认不存储,需要自己查询).

myisam

不支持事务,只支持表锁,增删改操作时会锁定整个表效率低,适合查询较多的情况

支持全文索引,存储表的总行数.

MySQL索引

什么是索引

数据库索引是为了实现高效数据查询的一种排好序的数据结构.

索引类似于书的目录,通过目录可以快速的定位到想要找到的数据.

因为一张表中的数据会有很多,如果直接去表中检索数据会效率低(逐行查找),

所以需要为表中的数据建立索引(一般主键默认会创建索引),这样就会提高查询效率

索引优势

提高了数据检索的效率,降低了数据库的IO成本;

通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗(索引是有序的);

索引劣势

1、占用磁盘空间;索引保存是要占用空间的.

2、增删改数据时,数据发生变化,索引也需要随之变动,也是需要开销的.

索引创建原则

哪些场景适合

主键 自动创建索引

查询条件列

多使用组合索引(多个列用一个索引)

,减少单值索引

建议排序和分组使用到的列

对数据量大的表

哪些场景不适合

表中数据比较少(类型表,菜单表,友情链接,系统信息表)

查询条件中用不到的列

增删改频率高的表

重复率高的列(性别 男 女)

索引分类

主键索引

创建表时,设置那个列为primary key 就是主键列,主键列就会自动创建索引

唯一索引

设置某个列数据唯一性,会创建唯一索引

单值索引

一个索引中,只包含一个列

组合索引(复合索引)

一个索引中包含多个列,节省了索引开支

在使用组合索引时,需要注意一个问题:满足组合索引最左前缀原则

在使用组合索引时,条件中必须要用到最左侧的列,否则索引失效

例如 a,b,c 3个列 a和b创建组合索引

使用时 where a=1 andb=2 索引生效

where a=1 and c=2 索引生效

where b=1 and c = 2 索引不生效

前缀索引

有些列长度比较大,需要只给前面指定的长度区间添加索引即可

全文索引

模糊查询时, 即使列有索引,也会导致索引失效

可以为列添加全文索引

CREATE FULLTEXT INDEX index_test2_title ON test2(title) WITH PARSER ngram;
explain SELECT * FROM test2 WHERE MATCH(title) AGAINST('美国')

mysql索引数据结构

由于二叉树,平衡二叉树一个节点只能存储一个元素,再加上mysql使用自增主键,导致不适合二叉树,平衡二叉树.

mysql底层使用的是B+树,

一个节点中可以存储多个索引数据,

表数据都存储在叶子节点, 非叶子节点不存储表数据,只存索引, 这样一个节点就可以存储更多的索引,

叶子节点之间还有指针指向, 所以非常适合范围查询

聚簇索引和非聚族索引 区分方式: 找到了索引就找了你要找的数据 这种设计称为聚簇索引.

聚簇索引: innodb引擎中主键索引 就是聚簇索引,主键和数据在一个树上

非聚簇索引: myisam引擎中,由于索引和数据分别在两个不同的文件中存储,找到了索引,还需要重新查找一次,才能我到数据,这种称为非聚簇索引

innodb引擎中 像普通的索引也称为二级索引,他们也是非聚簇索引.

例如姓名,通过名字查找人的所有信息时,在姓名索引树种找到后,还需要在主键索引树种再次进行查找,最终在主键索引树中找到数据,这种称为非聚簇索引

回表查询

回表查询指的是查询时的次数

例如 学生有id,学号,姓名三个信息

select * from student where id=1 通过id(主键)查询学生所有的信息,这时只需要查询一次即可,

select * from student where 学号=12 通过学号查询学生所有信息,由于学号是普通索引,先通过学号,在学号索引树上找学号,然后再通过id去回表二次查询主键索引树,查询两次,称为回表查询

select 学号 from student where 学号=12 通过学号查询自己(判断学号是否存在),由于使用学号只查询学号本身,并不查询其他数据,这种情况下,我们可以在学号索引树上直接找到学号数据,这种情况就不需要回表查询了,这种情况也可以称为是聚簇索引

索引下推

将条件筛选过程下推到索引树上,

以前没有索引下推,先找具体的数据,然后再对数据进行条件过滤,查询的数据范围就比较大

使用索引下推,直接在索引树上进行条件筛选,筛选出符合条件的记录,然后只将符合条件的记录进行回表查询,减少了回表查询的次数。

适用于非主键索引

事务

什么是数据库事务?

首先数据库事务是数据库对执行操作的一种管理机制。

保证在同一个事务中,一次执行的多条sql,是一个不可分割的单元,多条sql要么都执行,要么都不执行。

数据库事务特征

原子性:一次执行的多条sql,是一个不可分割的单元,多条sql要么都执行,要么都不执行。这是事务最基本的特征。

持久性:保证事务提交时,数据在数据库是持久保存的,即使操作时,出现宕机。

隔离性:mysql是运行多个并发事务同时对数据进行读和写操作的,这是可以采用不同的隔离级别进行控制。

隔离级别:读 未提交,读 已提交 , 可重复读,串行化 一次只允许一个事务操作

一致性:数据库事务终极目标,在我们对数据库多次操作的过程中,最终要保证数据和我们预期的结果是一致的。

转账案例:多次对同一个账号的金额进行操作,最终结果是不能出现错误的。

事务隔离性,隔离级别

提供4种隔离级别

读 未提交: 一个事务可以读到另一个事务还未提交的数据. 并发最高的,也是最不安全的

问题: 会出现脏读,不可重复读,幻读问题

脏读: A事物修改了数据,还没提交,这时被B事务读到了,但是A事务有可能出错回滚了,

这种情况下,B事务读到的数据就是垃圾数据.

读 已提交: 一个事务只能读到另一个事务已提交的数据.

读 已提交 能够解决脏读问题,但是没有解决不可重复读和幻读问题

不可重复读问题: 在同一个事务中,读取同一个id的数据两次,两次读到的数据不一致.

可 重复读: 同一个事物读取多次相同数据,多次读取返回的结果是一致的.

可 重复读 解决了 不可重复读问题

普通的查询解决了 幻读问题, 如果在查询语句后面添加了 for update,就会出现幻读问题.

幻读问题: 同一个事务中,多次读取数据,读到行数不同

mysql中默认隔离级别是 可 重复读.

串行化: 相当于加锁了, 解决以上所有的问题, 当一个事务操作时,其他事务必须等待,即使执行的是查询操作.

事务实现原理

持久性实现: 使用到redo log日志文件(重做日志) 保证已提交事务的数据持久保持.

当事务提交后,先用redo log日志文件进行存储, 因为在此过程中,有可能宕机,

如果此时宕机,确保操作数据存储记录下来(日志文件中), 这样在服务恢复时,可以继续将日志文件中的数据,写入到物理硬盘上.

原子性实现: 使用到undo log 日志文件, 当我们执行一个insert语句时, 在undo log 日志文件中记录一个delete语句, 执行delete语句, 在日志文件中记录insert语句,记录一个操作的反向操作,

当事务回滚时,执行undo log 日志中的反向操作.

隔离性实现:

提到了MVCC机制(多版本并发控制), 每次事务对数据操作时,都都会记录一个历史记录(记录事务id,还会记录上一次操作事务id)

还提到了一个readView(读视图),

当隔离级别为 读 已提交时: 在一个事物中,每次读时,都会从历史版本记录中,获取一个最新的快照,

这样,就会导致每次读到的是最新的数据, 也就会出现不可重复读问题,

当隔离级别为 可 重复读时, 在第一次读时,会获取一个快照,之后再次读取时,还是从第一次生成的快照中读数据,所以,两次读到数据是一样的, 解决了不可重复读.

一致性实现: 以上是三个都满足,既可实现一致性

mysql中读写不互斥(前提是没有使用串行化隔离级别)

但是写写操作是要互斥才行, mysql中使用锁机制来实现写写互斥.

按照锁的粒度分为:

全局锁: 锁定整个数据库,只允许读操作

一般在备份数据库时使用

FLUSH TABLES WITH READ LOCK

UNLOCK TABLES;

备份数据库语句 mysqldump --single-transaction -uroot -proot 库名> E:/文件名.sql

表级锁: 给整个表加锁

myisam引擎只支持表锁

innodb默认支持行锁,

行级锁: 加锁的粒度以行为单位

行级锁又可以分为:

行锁: 只锁定操作的那一行数据 使用的主键作为条件

间隙锁: 锁定的是一个范围 id>2 and id <6

临键锁: 是行锁和间隙锁的组合

共享锁:

主要是为查询语句添加的, 为查询语句如果添加了共享锁,那么其他事务可以读, 但是其他事务不能写的(指定的是同一条记录)

select * from employees where id = 1 lock in share mode为查询语句添加共享锁

读锁, 允许多个事务读, 不允许读写同时进行

排他锁: 就是互斥锁 当一个事物操作时,其他事务就不能进行加共享锁和排他锁操作.

insert ,update,delete操作时,自动会添加排他锁

查询操作如果需要添加排他锁, 可以在查询语句后面添加 for update语句

select * from employees where id = 1 for update

写锁

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【学术投稿-第四届智能电网和绿色能源国际学术会议(ICSGGE 2025)】CSS基本选择器详解:掌握基础,轻松布局网页

可线上 官网&#xff1a;www.icsgge.org 时间&#xff1a;2025年2月28-3月2日 目录 前言 一、基本选择器简介 1. 元素选择器&#xff08;Type Selector&#xff09; 基本语法 示例 注意事项 2. 类选择器&#xff08;Class Selector&#xff09; 基本语法 示例 注意…

编程题-字母异位词分组(中等-重点)

题目&#xff1a; 给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 解法一&#xff08;for循环遍历-时间复杂度超限&#xff09;&#xff1a; 由于互为字母异位词的…

Spring Boot整合DeepSeek实现AI对话(API调用和本地部署)

本篇文章会分基于DeepSeek开放平台上的API&#xff0c;以及本地私有化部署DeepSeek R1模型两种方式来整合使用。 本地化私有部署可以参考这篇博文 全面认识了解DeepSeek利用ollama在本地部署、使用和体验deepseek-r1大模型 Spring版本选择 根据Spring官网的描述 Spring AI是一…

阿里云IOT消息处理

文章主要讲述了阿里云IOT平台如何处理设备上报的消息、如何将消息路由到不同的处理逻辑、如何进行消息转发与转换等操作。 一、接收IOT消息 1.创建订阅 2.案列代码 官网案例代码&#xff1a;如何将AMQP JMS客户端接入物联网平台接收消息_物联网平台(IoT)-阿里云帮助中心 代码…

YOLO11网络结构以及改进1

YOLO11 1.YOLO11网络结构图在哪里&#xff1f;2.对应的网络结构图3.每一个模块详解3.1 Conv模块3.2关于卷积模块3.3 关于给各个模块指定参数的细节 4.加入CBAM 1.YOLO11网络结构图在哪里&#xff1f; 2.对应的网络结构图 3.每一个模块详解 3.1 Conv模块 位置&#xff1a;ultr…

数据结构——队列、哈希存储(2025.2.11)

目录 一、队列 1.定义 2.应用 3.分类 &#xff08;1&#xff09;逻辑结构 &#xff08;2&#xff09;物理结构 顺序队列 链式队列 二、哈希存储 1.定义 2.哈希冲突 &#xff08;1&#xff09;开放定址法 &#xff08;2&#xff09;再哈希法 &#xff08;3&#xf…

鸿蒙Next开发-添加水印以及点击穿透设置

在鸿蒙Next中&#xff0c;为App全局添加水印可以通过以下方式实现&#xff0c;其中通过窗口添加水印是一种常见且高效的方式。以下是具体方案和实现细节&#xff1a; 一、全局水印的实现方式 1. 窗口叠加水印&#xff08;首选、推荐&#xff09; 原理&#xff1a;在应用的主窗口…

C++算法竞赛基础语法-9

快速排序是一种高效的排序算法&#xff0c;由C. A. R. Hoare在1960年提出&#xff0c;基本思想是分治法&#xff08;Divide and Conquer&#xff09;策略&#xff0c;通过递归将一个大问题分解为若干个较小的子问题&#xff0c;然后合并这些子问题的解来解决原始问题 快速排序…

DeepSeek v3 技术报告阅读笔记

注 本文参考 DeepSeek-v3 / v2 / v1 Technical Report 及相关参考模型论文本文不包括基础的知识点讲解&#xff0c;为笔记/大纲性质而非教程&#xff0c;建议阅读技术报告原文交流可发送至邮箱 henryhua0721foxmail.com 架构核心 核心&#xff1a; MLA 高效推理DeepSeekMOE 更…

jemalloc 5.3.0的base模块的源码及调用链使用场景的详细分析

一、背景 这篇博客&#xff0c;我们继续之前的 由jemalloc 5.3.0初始化时的内存分配的分析引入jemalloc的三个关键概念及可借鉴的高性能编码技巧-CSDN博客 博客里对初始化分配逻辑进行分析&#xff0c;已经涉及到了jemalloc 5.3.0里的非常重要的base模块的一部分逻辑&#xff…

从零搭建微服务项目(第5章——SpringBoot项目LogBack日志配置+Feign使用)

前言&#xff1a; 本章主要在原有项目上添加了日志配置&#xff0c;对SpringBoot默认的logback的配置进行了自定义修改&#xff0c;并详细阐述了xml文件配置要点&#xff08;只对日志配置感兴趣的小伙伴可选择直接跳到第三节&#xff09;&#xff0c;并使用Feign代替原有RestT…

2024最新版JavaScript逆向爬虫教程-------基础篇之Chrome开发者工具学习

目录 一、打开Chrome DevTools的三种方式二、Elements元素面板三、Console控制台面板四、Sources面板五、Network面板六、Application面板七、逆向调试技巧 7.1 善用搜索7.2 查看请求调用堆栈7.3 XHR 请求断点7.4 Console 插桩7.5 堆内存函数调用7.6 复制Console面板输出 工…

Elasticsearch+Logstash+Kibana可视化集群部署

文章目录 1.组件介绍简述2.集群规划3.Es组件部署4.Logstash组件部署5.Kibana组件部署6.Kibana的基础使用 1.组件介绍简述 Elasticsearch&#xff1a;开源实时分布式搜索和分析引擎&#xff0c;支持大规模数据存储和高吞吐量&#xff0c;提供丰富的搜索功能和可扩展性。 Logsta…

08模拟法 + 技巧 + 数学 + 缓存(D3_数学)

目录 1. 多数元素 1.1. 题目描述 1.2. 解题思路 方法一&#xff1a;哈希表 方法二&#xff1a;排序 方法三&#xff1a;随机化 方法四&#xff1a;分治 方法五&#xff1a;Boyer-Moore 投票算法 2. 按规则计算统计结果 2.1. 题目描述 2.2. 解题思路 3. 整数拆分 3.…

基于IOS实现各种倒计时功能

ZJJTimeCountDown 效果图 特点&#xff1a; 1、已封装&#xff0c;支持自定义 2、支持文本各种对齐模式 3、各种效果都可以通过设置 ZJJTimeCountDownLabel 类属性来实现 4、支持背景图片设置 5、分文本显示时间时&#xff0c;支持设置文字大小&#xff0c;来动态设置每个文本…

【TS合成MP4】你怎么专打裂开的切片呀

写在前面&#xff1a;本博客仅作记录学习之用&#xff0c;部分图片来自网络&#xff0c;如需引用请注明出处&#xff0c;同时如有侵犯您的权益&#xff0c;请联系删除&#xff01; 文章目录 前言TS与MP4格式概述TS与MP4格式概述TS合成MP4的需求背景TS合成MP4的方法概述 合并方法…

【动手学强化学习】01初探强化学习

文章目录 什么是强化学习强化学习解决的问题强化学习的独特性 什么是强化学习 强化学习是机器通过与环境交互来实现目标的计算方法。智能体与环境的交互方式如图所示&#xff0c;在每一轮交互中&#xff0c;智能体根据感知状态经过自身计算给出本轮动作&#xff0c;将其作用于…

C++,STL容器适配器,priority_queue:优先队列深入解析

文章目录 一、容器概览与核心特性核心特性速览二、底层实现原理1. 二叉堆结构2. 容器适配器架构三、核心操作详解1. 容器初始化2. 元素操作接口3. 自定义优先队列四、实战应用场景1. 任务调度系统2. 合并K个有序链表五、性能优化策略1. 底层容器选择2. 批量建堆优化六、注意事项…

duckdb导出Excel和导出CSV速度测试

运行duckdb数据库 D:>duckdb v1.2.0 5f5512b827 Enter “.help” for usage hints. Connected to a transient in-memory database. Use “.open FILENAME” to reopen on a persistent database. 生成模拟数据&#xff0c;10个列&#xff0c;100万行数据&#xff1b; --…

k8s集群离线安装kuberay operator

1,安装方式 采用helm安装方式&#xff0c;首先下载对应的helm chart&#xff0c;这里采用v1.2.2版本&#xff0c;下载地址&#xff1a; https://github.com/ray-project/kuberay-helm/releases/tag/kuberay-operator-1.2.2 2,解压并修改镜像源 由于是在内网环境下搭建&#…