MySQL 45讲笔记(1-10讲)

1. SQL语句如何开始执行?

在这里插入图片描述

MySQL分为Server和存储引擎两部分:
Server层包含连接器、存储缓存、分析器、执行器等,以及所有的内置函数(事件、日期)等等,还有视图、触发器。
存储引擎是负责数据的存储和提取,我们有InnoDB、MyISAM等等。MySQL建表默认InnoDB,但是也可以指定。

  1. 如何去查询?
  2. 连接器先建立 TCP连接,查询你的权限,此次连接,你的权限不会被别人所更改。
  3. 执行select语句,先查缓存,没有命中就继续。大多数情况下缓存比较麻烦,最好不要用指定缓存查询。8.0之后就没缓存功能了
  4. 分析器。分析器用来检查SQL语法,并语法分析。
  5. 优化器。MySQL内部对语句判断如何选择索引。
  6. 执行器。判断你有权限,继续调用InnoDB,返回结果。

2.日志系统

更新流程:
redolog,binlog
redolog WAL技术,先写日志,不往前去更改,4个盘,循环的写。
在这里插入图片描述
redolog是存储引擎层的日志。

binlog是server层日志,追加写。
两阶段提交:
在这里插入图片描述
让两份日志之间的逻辑一致。

3. 事务隔离

  1. SQL标准的事务隔离级别包括:读未提交(read uncommitted)、
    读提交(read committed)、可重复读(repeatable read)和串行化(serializable )。
    读未提交是指,一个事务还没提交时,它做的变更就能被别的事务看到。
    读提交是指,一个事务提交之后,它做的变更才会被其他事务看到。
    可重复读是指,一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一
    致的。当然在可重复读隔离级别下,未提交变更对其他事务也是不可见的。
    串行化,顾名思义是对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突
    的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。

  2. 多版本的并发控制(MVCC),控制了回滚。

4.索引上

  1. 有序数组 哈希,只能用于静态存储引擎,写入了就不能去修改。
  2. 二叉树比较慢,所以InnoDB用B+树。
  3. 主键是一棵B+树,N个叉,只在叶子节点存所有数据的值,也被叫聚簇索引。
  4. 非主键索引的叶子是主键值,所以需要查找到主键值回表,去主键B+树去查值,如果说这个索引是个联合索引,又恰好你只需要这些值,那就不用回表,叫覆盖索引。
  5. 用自增主键可以防止页分裂的降低效率
  6. 最左前缀,

5. 索引下

  1. 覆盖索引:只需要查ID的值,而ID的值已经在k索引树上了,因此可以直接提供查询结果,不需要回表。
  2. 最左前缀:即当你创建了一个联合索引,该索引的任何最左前缀都可以用于查询。 比如当你有一个联合索引 (col1, col2, col3) ,该索引的所有前缀为 (col1) 、 (col1, col2) 、 (col1, col2, col3) ,包含这些列的所有查询都会使用该索引进行查询。
  3. 索引下推:组合索引满足最左匹配,但是遇到非等值判断时匹配停止。name like ‘陈%’ 不是等值匹配,所以 age = 20 这里就用不上 (name,age) 组合索引了。如果没有索引下推,组合索引只能用到 name,age 的判定就需要回表才能做了。5.6之后有了索引下推,age = 20 可以直接在组合索引里判定。

6.全局锁和表锁

MySQL M 里面的锁大致可以分成全局锁、表级锁和行锁三类

  1. 全局锁:做全库逻辑备份,保证备份时是唯一视图,MySQL里是mysqldump,参数single-transaction是做这个的,MVCC也能保证数据正常更新。别的引擎用FTWRL
  2. 表级锁:lock tables,面积太大。MySQL,引入MDL,增删改查时,加读锁,更改表结构,加写锁。读锁不互斥,写互斥,就是阻塞。
  3. 长事务不行,不提交占用MDL,阻塞。解决长事务,kill或者设定等待时间(指定DDL NOWIT/ WAIT N).
    ALTER TABLE tbl_name NOWAIT add column …
    ALTER TABLE tbl_name WAIT N add column …

7.行锁

  1. 两阶段锁:在InnoDB事务中,行锁是在需要的时候才加上的,但并不是不需要了就立刻释放,而是要等到事务结束Commit时才释放。这个就是两阶段锁协议。
  2. 更改操作顺序,共同操作的放后面,减少事务之间的等待。(影院买票,插日志,改顾客余额,更改影院余额放最后面)
  3. 死锁和死锁检测:死锁是并发中循环资源依赖,都在都等别人释放,导致都无限等待。A等待B放id2,B等A释放id1
  4. 解决死锁:
    • 设置超时时间,一般不用。
    • 主动死锁检测:解决热点更新的问题。1000个并发线程更改同一行,死锁检测是100万级。
    • 控制并发度,更改电影院账户为10个,分流。

8. 事务如何隔离

  1. 视图概念:一个用查询语句定义的虚拟表,调用的时候执行查询语句生成结果。
  2. InnoDB实现MVCC时用到的一致性视图,consistent read view,支持RC和RR隔离的实现。
  3. 每一行数据有多个由InnoDB发放的Transaction id,MVCC视图可以分为已提交事务,未提交事务集合,未开始事务。分别是可见,部分可见,不可见。
  4. 任务视图三种情况:
    • 版本未提交,不可见
    • 版本已提交,视图创建后提交,不可见
    • 版本已提交,视图创建前提交,可见
  5. 更新数据都是先读后写,这个读,只能读当前值,成为“当前读”。
  6. 可重复读(一致性读)核心就是唯一视图,更新数据只能用当前读,如果要更新数据被别人占用了没提交,就锁住了,称为行锁。

9. 普通索引和唯一索引

  1. change buffer 是InnoDB的内存操作,merge是得到新结果。
  2. 唯一索引要判断,需要加载入内存,已经在内存中的用内存更快。所以唯一索引不需要change buffer
  3. 如果插入值有冲突:
    • 普通索引会将更新记录在change buffer,后面merge后会持久化到磁盘。
    • 唯一索引将数据页读入内存,判断没有冲突,插入后,语句结束。(读入内存需要大量IO,change buffer减少这个操作)
  4. 写多读少场景,change buffer的收益最大。(账单类,日志类)。反之,是副作用。
  5. 尽量选择普通索引,配置change buffer比较好用
  6. redo log WAL,
    • 写操作:如果在内存中数据直接改,没在就change buffer记录中更改,最后都写入redolog中。
    • 读操作:在内存中直接返回,不在的,先读入内存,再根据buffer更改,生成正确版本返回。
  7. redo log节省随机写磁盘的IO消耗,change buffer节省随机读磁盘的消耗。

10. MySQL为什么有时候会选错索引?

  1. 删完再插入再查,时间变长,索引选择错误。是因为优化器选错索引。
  2. 选择索引错误,可以用analyze table t命令来重新统计索引信息。
  3. 矫正选择索引错误
    • force index来强制选择索引,在优化器失效时,可以起到矫正作用。
    • 修改SQL语句,order by b limit 1 -> order by b,a limit 1。a 1000行,也纳入排序,优化器知道a少,就索引a了
    • 新建合适的索引

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

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

相关文章

Java多款线程池,总有一款适合你。

线程池的选择 一:故事背景二:线程池原理2.1 ThreadPoolExecutor的构造方法的七个参数2.1.1 必须参数2.1.2 可选参数 2.2 ThreadPoolExecutor的策略2.3 线程池主要任务处理流程2.4 ThreadPoolExecutor 如何做到线程复用 三:四种常见线程池3.1 …

POI处理excel,根据XLOOKUP发现部分公式格式不支持问题

poi4不支持XLOOKUP函数,但poi最新的5.2.3却已经对此函数做了支持 poi下载地址:Index of /dist/poi/release/bin 公式源码位置:org/apache/poi/ss/formula/atp/XLookupFunction.java 但是在使用此函数过程中,发现有些XLOOKUP函数会…

网络设备(防火墙、路由器、交换机)日志分析监控

外围网络设备(如防火墙、路由器、交换机等)是关键组件,因为它们控制进出公司网络的流量。因此,监视这些设备的活动有助于 IT 管理员解决操作问题,并保护网络免受攻击者的攻击。通过收集和分析这些设备的日志来监控这些…

Oracle database Linux自建环境备份至远端服务器自定义保留天数

环境准备 linux下安装oracle 请看 oracle12c单节点部署 系统版本: CentOS 7 软件版本: Oracle12c 备份策略与实现方法 此次备份依赖Oracle自带命令exp与linux下crontab命令(定时任务) exp Oracle中exp命令是一个用于导出数据库数据和对象的…

虚拟机内搭建CTFd平台搭建及CTF题库部署,局域网内机器可以访问

一、虚拟机环境搭建 1、安装docker、git、docker-compose ubuntu: sudo apt-get update #更新系统 sudo apt-get -y install docker.io #安装docker sudo apt-get -y install git #安装git sudo apt-get -y install python3-pip #安装pip3 sudo pip install dock…

JavaEE初阶:多线程 - 编程

1.认识线程 我们在之前认识了什么是多进程,今天我们来了解线程。 一个线程就是一个 "执行流". 每个线程之间都可以按照顺讯执行自己的代码. 多个线程之间 "同时" 执行 着多份代码. 引入进程这个概念,主要是为了解决并发编程这样的…

时序预测 | MATLAB实现CNN-BiGRU-Attention时间序列预测

时序预测 | MATLAB实现CNN-BiGRU-Attention时间序列预测 目录 时序预测 | MATLAB实现CNN-BiGRU-Attention时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLAB实现CNN-BiGRU-Attention时间序列预测,CNN-BiGRU-Attention结合注意力机制时…

机器学习笔记之优化算法(十二)梯度下降法:凸函数VS强凸函数

机器学习笔记之优化算法——梯度下降法:凸函数VS强凸函数 引言凸函数:凸函数的定义与判定条件凸函数的一阶条件凸函数的梯度单调性凸函数的二阶条件 强凸函数强凸函数的定义强凸函数的判定条件强凸函数的一阶条件强凸函数的梯度单调性强突函数的二阶条件…

【从零学习python 】21.Python中的元组与字典

文章目录 元组一、访问元组二、修改元组三、count, index四、定义只有一个数据的元组五、交换两个变量的值 字典介绍一、列表的缺点二、字典的使用进阶案例 元组 Python的元组与列表类似,不同之处在于元组的元素不能修改。元组使用小括号,列表使用方括号…

C++初阶之一篇文章教会你queue和priority_queue(理解使用和模拟实现)

queue和priority_queue(理解使用和模拟实现) 什么是queuequeue的使用1.queue构造函数2.empty()3.size()4.front()5.back();6.push7.emplace8.pop()9.swap queue模拟实现什么是priority_queuepriority_queue的使用1.priority_queue构造函数1.1 模板参数 C…

论文阅读 RRNet: A Hybrid Detector for Object Detection in Drone-captured Images

文章目录 RRNet: A Hybrid Detector for Object Detection in Drone-captured ImagesAbstract1. Introduction2. Related work3. AdaResampling4. Re-Regression Net4.1. Coarse detector4.2. Re-Regression 5. Experiments5.1. Data augmentation5.2. Network details5.3. Tra…

DP(区间DP)

目录 石子合并 合并果子(贪心 Huffman树) 环形石子合并 石子合并 设有 N 堆石子排成一排,其编号为 1,2,3,…,N。 每堆石子有一定的质量,可以用一个整数来描述,现在要将这 N 堆石子合并成为一堆。 每次只能合并相邻…

全文检索与日志管理 Elasticsearch(上)

一、Elasticsearch介绍 1.1 全文检索索引 Elasticsearch是一个全文检索服务器,全文检索是一种非结构化数据的搜索方式。 那么什么是结构化数据和非结构化数据呢? 结构化数据:指具有固定格式固定长度的数据,如数据库中的字段。 …

如何有效开展网络安全事件调查工作

网络安全事件调查是现代企业网络安全体系建设的关键组成部分。为了防止网络攻击,仅仅关注于安全工具的应用效果远远不够,因为安全事件一直都在发生。安全团队只有充分了解攻击者的行踪和攻击路径,才能更好地防范更多攻击时间的发生。 做好网…

基于Python爬虫+词云图+情感分析对某东上完美日记的用户评论分析

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

【go语言学习笔记】05 Go 语言实战

文章目录 一、 RESTful API 服务1. RESTful API 定义1.1 HTTP Method1.2 RESTful API 规范 2. RESTful API 风格示例3. RESTful JSON API4. Gin 框架4.1 导入 Gin 框架4.2 使用 Gin 框架4.2.1 获取特定的用户(GET)4.2.2 新增一个用户(POST&am…

ElasticSearch安装与介绍

Elastic Stack简介 如果没有听说过Elastic Stack,那你一定听说过ELK,实际上ELK是三款软件的简称,分别是Elasticsearch、 Logstash、Kibana组成,在发展的过程中,又有新成员Beats的加入,所以就形成了Elastic…

9月大理,Move HackerHouse,成为全球数字游民的第一站

🚀世界各地的 hacker 们!即日起,我们正式向您发出 co-buiding & co-living 的邀请! 9.3日至9.24日,为期3周的 Move 主题Antalpha HackerHouse 将坐落于大理,邀请所有 Web3 开发者一起探索 Move 生态发…

基于Selenium模块实现无界面模式 执行JS脚本

此篇文章主要介绍如何使用 Selenium 模块实现 无界面模式 & 执行JS脚本(把滚动条拉到底部),并以具体的示例进行展示。 1、Selenium 设置无界面模式 创建浏览器对象之前,创建 options 功能对象 :options webdriver.ChromeOptions() 添加…

微服务系列(2)--注册中心

在博文:微服务系列(1)里我们提到过注册中心的概念,简单来说微服务注册中心是一个用于存储和管理微服务实例信息的组件,它提供了服务注册、服务发现、服务健康检查等功能,以确保微服务之间的稳定通信。在微服务架构中,各…