MySQL 45讲笔记(1-10讲)
1. SQL语句如何开始执行?

MySQL分为Server和存储引擎两部分:
Server层包含连接器、存储缓存、分析器、执行器等,以及所有的内置函数(事件、日期)等等,还有视图、触发器。
存储引擎是负责数据的存储和提取,我们有InnoDB、MyISAM等等。MySQL建表默认InnoDB,但是也可以指定。
- 如何去查询?
- 连接器先建立 TCP连接,查询你的权限,此次连接,你的权限不会被别人所更改。
- 执行select语句,先查缓存,没有命中就继续。大多数情况下缓存比较麻烦,最好不要用指定缓存查询。8.0之后就没缓存功能了
- 分析器。分析器用来检查SQL语法,并语法分析。
- 优化器。MySQL内部对语句判断如何选择索引。
- 执行器。判断你有权限,继续调用InnoDB,返回结果。
2.日志系统
更新流程:
redolog,binlog
redolog WAL技术,先写日志,不往前去更改,4个盘,循环的写。

redolog是存储引擎层的日志。
binlog是server层日志,追加写。
两阶段提交:

让两份日志之间的逻辑一致。
3. 事务隔离
-
SQL标准的事务隔离级别包括:读未提交(read uncommitted)、
读提交(read committed)、可重复读(repeatable read)和串行化(serializable )。
读未提交是指,一个事务还没提交时,它做的变更就能被别的事务看到。
读提交是指,一个事务提交之后,它做的变更才会被其他事务看到。
可重复读是指,一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一
致的。当然在可重复读隔离级别下,未提交变更对其他事务也是不可见的。
串行化,顾名思义是对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突
的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。 -
多版本的并发控制(MVCC),控制了回滚。
4.索引上
- 有序数组 哈希,只能用于静态存储引擎,写入了就不能去修改。
- 二叉树比较慢,所以InnoDB用B+树。
- 主键是一棵B+树,N个叉,只在叶子节点存所有数据的值,也被叫聚簇索引。
- 非主键索引的叶子是主键值,所以需要查找到主键值回表,去主键B+树去查值,如果说这个索引是个联合索引,又恰好你只需要这些值,那就不用回表,叫覆盖索引。
- 用自增主键可以防止页分裂的降低效率
- 最左前缀,
5. 索引下
- 覆盖索引:只需要查ID的值,而ID的值已经在k索引树上了,因此可以直接提供查询结果,不需要回表。
- 最左前缀:即当你创建了一个联合索引,该索引的任何最左前缀都可以用于查询。 比如当你有一个联合索引 (col1, col2, col3) ,该索引的所有前缀为 (col1) 、 (col1, col2) 、 (col1, col2, col3) ,包含这些列的所有查询都会使用该索引进行查询。
- 索引下推:组合索引满足最左匹配,但是遇到非等值判断时匹配停止。name like ‘陈%’ 不是等值匹配,所以 age = 20 这里就用不上 (name,age) 组合索引了。如果没有索引下推,组合索引只能用到 name,age 的判定就需要回表才能做了。5.6之后有了索引下推,age = 20 可以直接在组合索引里判定。
6.全局锁和表锁
MySQL M 里面的锁大致可以分成全局锁、表级锁和行锁三类
- 全局锁:做全库逻辑备份,保证备份时是唯一视图,MySQL里是mysqldump,参数single-transaction是做这个的,MVCC也能保证数据正常更新。别的引擎用FTWRL
- 表级锁:lock tables,面积太大。MySQL,引入MDL,增删改查时,加读锁,更改表结构,加写锁。读锁不互斥,写互斥,就是阻塞。
- 长事务不行,不提交占用MDL,阻塞。解决长事务,kill或者设定等待时间(指定DDL NOWIT/ WAIT N).
ALTER TABLE tbl_name NOWAIT add column …
ALTER TABLE tbl_name WAIT N add column …
7.行锁
- 两阶段锁:在InnoDB事务中,行锁是在需要的时候才加上的,但并不是不需要了就立刻释放,而是要等到事务结束Commit时才释放。这个就是两阶段锁协议。
- 更改操作顺序,共同操作的放后面,减少事务之间的等待。(影院买票,插日志,改顾客余额,更改影院余额放最后面)
- 死锁和死锁检测:死锁是并发中循环资源依赖,都在都等别人释放,导致都无限等待。
A等待B放id2,B等A释放id1 - 解决死锁:
- 设置超时时间,一般不用。
- 主动死锁检测:解决热点更新的问题。1000个并发线程更改同一行,死锁检测是100万级。
- 控制并发度,更改电影院账户为10个,分流。
8. 事务如何隔离
- 视图概念:一个用查询语句定义的虚拟表,调用的时候执行查询语句生成结果。
- InnoDB实现MVCC时用到的一致性视图,consistent read view,支持RC和RR隔离的实现。
- 每一行数据有多个由InnoDB发放的Transaction id,MVCC视图可以分为已提交事务,未提交事务集合,未开始事务。分别是可见,部分可见,不可见。
- 任务视图三种情况:
- 版本未提交,不可见
- 版本已提交,视图创建后提交,不可见
- 版本已提交,视图创建前提交,可见
- 更新数据都是先读后写,这个读,只能读当前值,成为“当前读”。
- 可重复读(一致性读)核心就是唯一视图,更新数据只能用当前读,如果要更新数据被别人占用了没提交,就锁住了,称为行锁。
9. 普通索引和唯一索引
- change buffer 是InnoDB的内存操作,merge是得到新结果。
- 唯一索引要判断,需要加载入内存,已经在内存中的用内存更快。所以唯一索引不需要change buffer
- 如果插入值有冲突:
- 普通索引会将更新记录在change buffer,后面merge后会持久化到磁盘。
- 唯一索引将数据页读入内存,判断没有冲突,插入后,语句结束。(读入内存需要大量IO,change buffer减少这个操作)
- 写多读少场景,change buffer的收益最大。(账单类,日志类)。反之,是副作用。
- 尽量选择普通索引,配置change buffer比较好用
- redo log WAL,
- 写操作:如果在内存中数据直接改,没在就change buffer记录中更改,最后都写入redolog中。
- 读操作:在内存中直接返回,不在的,先读入内存,再根据buffer更改,生成正确版本返回。
- redo log节省随机写磁盘的IO消耗,change buffer节省随机读磁盘的消耗。
10. MySQL为什么有时候会选错索引?
- 删完再插入再查,时间变长,索引选择错误。是因为优化器选错索引。
- 选择索引错误,可以用analyze table t命令来重新统计索引信息。
- 矫正选择索引错误
- force index来强制选择索引,在优化器失效时,可以起到矫正作用。
- 修改SQL语句,order by b limit 1 -> order by b,a limit 1。a 1000行,也纳入排序,优化器知道a少,就索引a了
- 新建合适的索引
相关文章:
MySQL 45讲笔记(1-10讲)
1. SQL语句如何开始执行? MySQL分为Server和存储引擎两部分: Server层包含连接器、存储缓存、分析器、执行器等,以及所有的内置函数(事件、日期)等等,还有视图、触发器。 存储引擎是负责数据的存储和提取&a…...
U盘数据如何保密?U盘数据加密软件合集
当我们将重要数据存放在U盘中时,必须要保障U盘的安全,以避免数据泄露。那么,U盘数据该如何保密呢?下面我们就来盘点一下那些好用的U盘数据保护方法。 U盘写保护 起初U盘写保护是专门为U盘防病毒而设计的,写保护后会将…...
此文详解,数据仓库管理建设的经验
目前由于数据分散在不同的存储环境或数据库中,对于新业务需求的开发需要人工先从不同的数据库中同步、集中、合并等处理,造成资源和人力的浪费。同时,目前的系统架构,无法为未来数据驱动业务创新的理念提供友好的支撑。需要建设新…...
01 - 工作区、暂存区、版本库、远程仓库 - 以一次连贯的提交操作为例
查看所有文章链接:(更新中)GIT常用场景- 目录 文章目录 1. 工作区、暂存区、版本库、远程仓库1.1 工作区1.2 工作区 > 暂存区:git add1.3 暂存区 > 版本库:git commit1.4 push到远程仓库 1. 工作区、暂存区、版本…...
cesium学习记录06-视图、场景与相机
一、视图(Viewer) viewer是cesium的核心类,是一切的开端。通过new Cesium.Viewer(container, options)来创建一个Viewer对象,而通过这个 Viewer对象,可以添加图层、实体、相机控制等,以及设置一些全局属性…...
flutter开发实战-MethodChannel实现flutter与原生Android双向通信
flutter开发实战-MethodChannel实现flutter与原生Android双向通信 最近开发中需要原生Android与flutter实现通信,这里使用的MethodChannel 一、MethodChannel MethodChannel:用于传递方法调用(method invocation)。 通道的客户端和宿主端通过传递给通…...
django使用多个数据库实现
一、说明: 在开发 Django 项目的时候,很多时候都是使用一个数据库,即 settings 中只有 default 数据库,但是有一些项目确实也需要使用多个数据库,这样的项目,在数据库配置和使用的时候,就比较麻…...
Linux常见面试题,应对面试分享
操作系统基础 1.cpu占⽤率太⾼了怎么办? 排查思路是什么,怎么定位这个问题,处理流程 其他程序: 1.通过top命令按照CPU使⽤率排序找出占⽤资源最⾼的进程 2.lsof查看这个进程在使⽤什么⽂件或者有哪些线程 3.询问开发或者⽼⼤,是什么业务在使⽤这个进程…...
mysql索引的数据结构(Innodb)
首选要注意,这里的数据结构是存储在硬盘上的数据结构,不是内存中的数据结构,要重点考虑io次数. 一.不适合的数据结构: 1.Hash:不适合进行范围查询和模糊匹配查询.(有些数据库索引会使用Hash,但是只能精准匹配) 2.红黑树:可以范围查询和模糊匹配,但是和硬盘io次数比较多. 二…...
【MySQL】Java实现JDBC编程
文章目录 1. JDBC2. 添加驱动包3. 编程3.1 创建数据源3.2 与数据库建立连接3.3 构造SQL语句3.4 执行SQL语句3.5 释放资源,关闭连接 1. JDBC 数据库编程必须掌握至少一门编程语言,一种数据库,会导入数据库驱动包。 操作和连接不同数据库都需要…...
纽扣电池寿命和功率增强器
近日,基础半导体器件领域的高产能生产专家Nexperia(安世半导体)宣布推出NBM7100和NBM5100。这两款IC采用了具有突破意义的创新技术,是专为延长不可充电的典型纽扣锂电池寿命而设计的新型电池寿命增强器,相比于同类解决…...
bilibili倍数脚本,油猴脚本
一. 内容简介 bilibili倍数脚本,油猴脚本 二. 软件环境 2.1 Tampermonkey 三.主要流程 3.1 创建javascript脚本 点击添加新脚本 就是在 (function() {use strict;// 在这编写自己的脚本 })();倍数脚本,含解析 // UserScript // name bi…...
8.14 作业
1. .text .globl _start_start:mov r0,#0x9mov r1,#0xfbl loop loop:cmp r0,r1beq stopsubhi r0,r1subls r1,r0mov pc,lr stop:b stop 2.实现1-100的和 .text .globl _start_start:mov r0,#0x1bl loop loop:cmp r0,#0x64bhi stopaddls r1,r0addls r0,#0x1mov pc,lr stop:b sto…...
Debian安装和使用Elasticsearch 8.9
命令行通过 .deb 包安装 Elasticsearch 创建一个新用户 adduser elastic --> rust # 添加sudo权限 # https://phoenixnap.com/kb/how-to-create-sudo-user-on-ubuntu usermod -aG sudo elastic groups elastic下载Elasticsearch v8.9.0 Debian 包 https://www.elastic.co/…...
三 、CTR预估数据准备
三 CTR预估数据准备 3.1 分析并预处理raw_sample数据集 # 从HDFS中加载样本数据信息 df spark.read.csv("hdfs://localhost:9000/datasets/raw_sample.csv", headerTrue) df.show() # 展示数据,默认前20条 df.printSchema()显示结果: ------------…...
netty学习分享 二
操作系统IO模型与实现原理 阻塞IO 模型 应用程序调用一个IO函数,导致应用程序阻塞,等待数据准备好。如果数据没有准备好,一直等待….数据准备好了,从内核拷贝到用户空间,IO函数返回成功指示。 当调用recv()函数时,系…...
聊聊web服务器NGINX
文章目录 聊聊web服务器NGINXNGINX的起源NGINX早期阶段首次发布快速扩展模块化架构逐步增加功能商业收购 NGINX能做什么NGINX的优势NGINX为何能兴起 聊聊web服务器NGINX NGINX的起源 NGINX是一个 HTTP 和反向代理服务器,一个邮件代理服务器,以及一个通…...
【hello C++】特殊类设计
目录 一、设计一个类,不能被拷贝 二、设计一个类,只能在堆上创建对象 三、设计一个类,只能在栈上创建对象 四、请设计一个类,不能被继承 五、请设计一个类,只能创建一个对象(单例模式) C🌷 一、设计一个类&…...
js实现按创建时间戳1609459200000 开始往后开始显示运行时长-demo
运行时长 00日 00时 17分 59秒 代码 function calculateRuntime(timestamp) {const startTime Date.now(); // 获取当前时间戳//const runtimeElement document.getElementById(runtime); // 获取显示运行时长的元素function updateRuntime() {const currentTimestamp Date…...
latex三线表按页面大小填充
latex三线表按页面大小填充 使用Latex表格时会出现下图情况,表格没有填充整个页面,导致不美观。 解决方法: 在\begin{tabular}前加上\resizebox{\linewidth}{!}{ , 在\end{tabular} 后加 ‘}’ 如下:\resizebox{…...
ParaView时间戳设置全攻略:从基础标注到自定义格式(5.8.0实测)
ParaView时间戳设置全攻略:从基础标注到自定义格式(5.8.0实测) 在科学可视化领域,时间戳不仅是数据演变的见证者,更是研究成果呈现的专业语言。ParaView作为开源可视化工具链的标杆,其时间标注功能在学术论…...
DIY复刻经典:Texar Audio Prism动态处理器克隆套件全攻略
1. 项目概述:Texar Audio Prism 克隆套件如果你在专业音频圈子里混过一段时间,尤其是对上世纪八九十年代那些经典的、带点“魔法”色彩的外置动态处理器感兴趣,那么“Texar Audio Prism”这个名字你大概率不会陌生。它不是最常见的1176或者LA…...
半导体元件(二极管/三极管/MOS管/IC)损坏诊断全解
半导体元件(二极管、三极管、MOS 管、集成电路)是 PCB 的核心功能单元,对过压、过流、ESD、高温极度敏感,损坏后直接导致电路功能失效、短路烧板。很多工程师维修时盲目更换芯片,不仅成本高,还易误判。一…...
从“DOC/PDF”到“WPS”:细看GJB438C-2021文档格式要求背后的国产化信号与落地指南
从“DOC/PDF”到“WPS”:GJB438C-2021文档格式变革的深度解读与实施策略 当一份国家军用标准在文档格式描述中刻意删除"DOC/PDF"字样,转而明确标注"(WPS)文档处理器"时,这绝非简单的技术参数调整。…...
武汉国电华美串联谐振试验装置,现场用着心里有底
在高压试验现场干了这么多年,这位老师傅常说,一台好的串联谐振装置,就是试验人员的胆。面对GIS、大型变压器、超高压电缆这些大电容试品,没有趁手的谐振设备,交流耐压试验根本没法干。16875kVA/225kV这个规格ÿ…...
Taotoken的审计日志功能为企业API安全与合规管理提供支持
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Taotoken的审计日志功能为企业API安全与合规管理提供支持 当企业决定将大模型能力集成到内部业务流程中时,IT管理员和安…...
机器学习在射电天文数据分类中的应用:以MIGHTEE巡天SFG/AGN分类为例
1. 项目概述:当机器学习遇见深空射电巡天在射电天文学领域,我们正经历一场数据洪流。以MeerKAT望远镜阵列主导的MIGHTEE巡天项目为例,其在COSMOS天区的一次早期科学数据释放,就在不到1平方度的天区内探测到了超过6000个射电源。传…...
告别手动复制!用这个自定义编辑器脚本一键备份/克隆Unity Terrain Data
告别手动复制!用这个自定义编辑器脚本一键备份/克隆Unity Terrain Data在Unity关卡设计和技术美术的工作流中,地形数据的灵活复用往往意味着反复的手动操作——导出高度图、备份材质参数、复制植被分布,每个环节都可能成为效率瓶颈。想象这样…...
基于LSTM自编码器的家用电器功耗异常检测系统构建指南
1. 项目概述:从能耗洞察到智能干预我们每天都在和各种家用电器打交道,从清晨唤醒你的咖啡机,到深夜还在默默工作的路由器。你有没有想过,这些看似微不足道的设备,其背后隐藏的能耗模式,其实大有文章&#x…...
【RT-DETR实战】070、模型分析工具:PyTorch Profiler性能分析
上周在部署RT-DETR到边缘设备时遇到一个诡异现象:模型推理时延波动极大,有时30ms,偶尔突然跳到200ms。 盯着代码看了半天没发现逻辑问题,数据流也正常。这种时候,靠猜是没用的,必须上性能分析工具——PyTorch Profiler。 今天我们就来聊聊怎么用它揪出那些藏在细节里的…...
