【MySQL 45讲笔记】

2023-09-22 09:38:58

第一讲:一条SQL查询语句是如何执行的?

  • 连接器:在完成了经典的TCP握手后,开始认证身份,以及校验权限
  • 分析器:词法分析和语法分析
  • 优化器:使用哪个索引、各个表的连接顺序
  • 执行器:调用引擎接口取数据,判断是否符合条件,符合条件的放在结果集
  • 存储引擎:与磁盘交互,获取数据,返回给执行器

第二讲:一条SQL更新语句是如何执行的?

两个重要日志

  • bin log:server层、追加写、记录更新SQL语句
  • redo log:存储引擎、覆盖写、记录更新数据

更新过程

  • redo log - prepare:更新数据记录到内存
  • bin log:更新语句记录到磁盘
  • redo log - commit:更新数据记录到磁盘

第三讲:事务隔离,为什么你改了我还看不见

事务执行语句

  • 事务启动语句:begin、start transaction
  • 事务提交语句:commit
  • 事务回滚语句:rollback
  • 自动提交关闭:set autocommit = 0

第四讲:深入浅出索引(上)

创建索引语句

create table T(
	id int primary key,
	k int not null,
	name varchar(16),
	index(k)
)engine = InnoDB;

主键索引和普通索引的区别

  • 主键索引不需要回表。普通索引如果没有覆盖索引就需要回表

第五讲:深入浅出索引(下)

几个重要的概念

  • 覆盖索引:普通索引如果是覆盖索引,那就不用回表
  • 最左前缀原则:索引内的多个字段从左到右,字段的内容也是从做到右
  • 索引下推:可以减少回表次数

第六讲:全局锁和表锁,给表加个字段怎么有这么多阻碍?

全局锁

  • 全局读锁命令:Flush tables with read lock
  • 典型使用场景:全库逻辑备份

表级锁

  • 表锁(数据锁):lock tables t1 read, t2 write;(加锁)、unlock table;(解锁)
  • 元数据锁MDL(表结构锁):不需要显式使用,在访问一个表的时候就会被自动加上

行级锁

  • MySQL的行级锁是在引擎层由各个引擎自己实现的,但并不是所有的引擎都支持行锁

第七讲:行锁功过,怎么减少行锁对性能的影响?

重要概念

  • 两阶段锁:上锁阶段和解锁阶段
  • 死锁:两阶段锁会导致死锁

死锁解决

  • 设置死锁超时:innodb_lock_wait_timeout = 50
  • 设置死锁检测:innodb_deadlock_detect = on
  • 控制并发度:控制操作同一行数据的线程数
  • 将一行改成逻辑上的多行来减少锁冲突

第八讲:事务到底是隔离的还是不隔离的?

两种读

  • 当前读:读最新提交的数据
  • 一致性读:遵循隔离机制来读取数据

不同操作的隔离机制

  • 更新操作:读已提交(当前读)
  • 查询操作:可重复读(一致性读)

思考一下为什么?
事务B查到K的值是3,而事务A查到K的值是1
在这里插入图片描述

第九讲:普通索引和唯一索引,应该怎么选择?

因为唯一索引的更新操作可能无法使用change buffer,所以一般推荐选择普通索引。

第十讲:MySQL为什么有时候会选错索引?

查询索引信息

  • 命令:show index from table_name;

影响索引选择的因素

  • 扫描行数:优先选择扫描行数小的索引
  • 区分度:区分度越大,扫描行数越小
  • 回表:如果普通索引+回表消耗的性能大于全表查询,那么就会导致索引失效
  • 字段排序:

索引选择错误的解决办法

  • 执行修正命令:analyze table t;
  • 强制使用索引:select * from t force(a) where …
  • 引导使用索引:order by b变成order by b,a
  • 删除误用的索引

第十一讲:怎么给字符串字段加索引?

  • 命令:alter table user add index index_email(email6));
  • 原则:在区分度和索引长度之间权衡利弊

第十二讲:为什么我的MySQL会“抖”一下?

主要分为两种场景,导致MySQL突然抖一下

  • redo log写满了,要刷新redo log内存(日志写回磁盘)
  • 缓冲池buffer pool不够用了,要先将脏页写到磁盘(数据页写回磁盘)

InnoDB刷脏页的控制策略

  • 影响InnoDB刷脏页能力的因素:脏页比例、redo log写盘速度
  • 通过命令可以获取磁盘的IOPS,然后将InnoDB的innodb_io_capacity设置为IOPS
  • InnoDB的实际刷盘速度,内部计算出一个R%,然后乘以innode_io_capacity,就是刷盘速度

第十三讲:为什么表数据删掉一半,表文件大小不变?

  • delete命令其实只是把记录的位置,或者数据页标记为了“可复用”,但磁盘文件的大小是不会变的。也就是说,通过delete命令是不能回收表空间的。这些可以复用,而没有被使用的空间,看起来就像是“空洞”。

第十四讲:count(*)这么慢,我该怎么办?

  • 随着系统中记录数越来越多,select count(*) from table_name也会执行得越来越慢
  • 可以使用缓存、数据表来存储count(*)的值
  • 不同count的性能:count(字段)< count(主键id)< count(1)≈ count(*)

第十六讲:order by是怎么工作的?

select city, name, age from T where city = '杭州' order by name limit 1000;

  • 全字段排序:取出整行数据,然后取city、name、age放入sort_buffer排序,不需要回表
  • rowid排序:取出整行数据,部分字段放入sort_buffer排序,需要回表
  • 如果(city, name)是索引,那么上面的order by就不需要排序

第十七讲:为什么我只查一行的语句,也执行这么慢?

select * from table where id = 1

  • 等锁释(MDL锁、行锁)
  • 等flush刷盘

select * from table where c = 50000 limit 1

  • 查询慢:全表扫描、
  • 事务:一致性读导致的undo很多次,当前读直接读最新值
更多推荐

2023工博会强势回归!智微工业携八大系列重磅亮相

中国国际工业博览会(简称"中国工博会")自1999年创办以来,历经二十余年发展创新,通过专业化、市场化、国际化、品牌化运作,已发展成为通过国际展览业协会(UFI)认证、中国工业领域规模最大、功能最全、水平最高、影响力最强的展览盛会之一。三年磨一剑,此次工博会众盼回归,智微工业借此以磅礴气势重构“智能工业新定义”,携八大

第十届国家网络安全宣传周今日在全国范围内启动

十届国家网络安宣传周回望2023年国家网络安全宣传周于9月11日至17日在全国范围内统一开展。其中,开幕式等重要活动在福建省福州市举行。第一届国家网络安全宣传周活动始于2014年,此后将每年9月的第三周定为活动举行日。网络安全宣传周至今已经走过10个年头。作为网络安全界的盛会,每一年都是嘉宾云集,大咖齐聚,展示前言技术

MySQL索引、事务、事务与存储引擎

1、索引1.1索引的概念●索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址(类似于C语言的链表通过指针指向数据记录的内存地址)。●使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找到该行数据对应的物理地址然后访问相应的数据,因此能加快数据库的查询速度。●索引就好比是一本书的

VLANIF配置

目录实验原理:案例:设备配置用ping验证不同vlan之间实现相互通信实验原理:VLANIF接口是一种第三层的逻辑接口,用于在第三层实现不同VLAN之间的通信。每个VALN有一个VLANIF接口,并通过该接口在网络层转发VLAN通信。由于每个VLAN是一个广播域,每个VLAN可以被看作是一个IP网段,因此可以把VLAN

ChatGPT所引用的参考文献根本不存在?如何正确使用AI工具?

从ChatGPT推出以来,一直都是一个热点话题,尤其是在高等教育领域,大家展开了非常激烈的讨论。巴斯大学对ChatGPT进行测试时发现,ChatGPT生成的论文,其参考文献的引用格式看起来很完美,有作者姓名和期刊名称,甚至标题听起来都很专业,但这篇论文压根儿就不存在。一方面,ChatGPT可以在很大程度上帮助学生对知识

SQL注入类型判断

SQL注入的类型分为字符型和数字型,以sqli-labs靶场1、2关为例:文章目录第一关第二关无错误回显的判断第一关第一关注入一个1’,错误回显出下面内容,其中1’是注入的内容,0,1后面的单引号和最前面的单引号是一对,剩下的两个单引号是一对,错误回显出上面内容说明是字符型注入。''1''LIMIT0,1'第二关第二关

Bigemap在市政工程设计给排水行业的应用场景?

去年单位采购的,今年11月份才分配给我使用。使用场景:现场定位:通过我们电脑导入cad图纸数据,根据需求可以画一些简单的示意路线,发送到手机进行现场比对,最后会在cad里面加入管道设计方案。去年单位采购的,今年11月份才分配给我使用。使用场景:现场定位:通过我们电脑导入cad图纸数据,根据需求可以画一些简单的示意路线,

Vue的详细教程--用Vue-cli搭建SPA项目

Vue的详细教程--用Vue-cli搭建SPA项目1.Vue-cli是什么2.什么是SPA项目1.vueinitwebpackspa2.一问一答模式2:运行完上面的命令后,我们需要将当前路径改变到SPA这个文件夹内,然后安装需要的模块此步骤可理解成:maven的web项目创建成功后,修改pom文件添加依赖3.启动并访问

MYSQL--索引

目录一、索引的概念:二、索引的作用:三、索引的缺点:四、创建索引的原则依据:五、索引的分类和创建:1.普通索引:2.唯一索引:3.主键索引:4.组合索引:5.全文索引:六、查看删除索引:1.查看索引:2.删除索引:一、索引的概念:索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址(类似于

SpringSecurity 初始化解析

文章目录前言加载SpringSecurity配置解析配置SpringSecurity解析器security:http解析FilterChainProxy的注册过程创建SpringSecurity过滤器总结前言通过上文分析知道了SpringSecurity对一个请求的具体处理流程。不知道大家是否跟我一样都有几个疑问:Fi

已知我有一个表格里有编号状态和名称的列,如何转换为目标样式?

点击上方“Python爬虫与数据挖掘”,进行关注回复“书籍”即可获赠Python从入门到进阶共10本电子书今日鸡汤此臣所以报先帝而忠陛下之职分也。大家好,我是皮皮。一、前言前几天在Python最强王者交流群【黑科技·鼓包】问了一个Python自动化办公的问题,一起来看看吧。请教一下PANDA库的问题:已知我有一个表格里

热文推荐