【MySQL 45讲笔记】

news2025/2/25 11:13:52

文章目录

  • 第一讲:一条SQL查询语句是如何执行的?
  • 第二讲:一条SQL更新语句是如何执行的?
  • 第三讲:事务隔离,为什么你改了我还看不见
  • 第四讲:深入浅出索引(上)
  • 第五讲:深入浅出索引(下)
  • 第六讲:全局锁和表锁,给表加个字段怎么有这么多阻碍?
  • 第七讲:行锁功过,怎么减少行锁对性能的影响?
  • 第八讲:事务到底是隔离的还是不隔离的?
  • 第九讲:普通索引和唯一索引,应该怎么选择?
  • 第十讲:MySQL为什么有时候会选错索引?
  • 第十一讲:怎么给字符串字段加索引?
  • 第十二讲:为什么我的MySQL会“抖”一下?
  • 第十三讲:为什么表数据删掉一半,表文件大小不变?
  • 第十四讲:count(*)这么慢,我该怎么办?
  • 第十六讲:order by是怎么工作的?
  • 第十七讲:为什么我只查一行的语句,也执行这么慢?

第一讲:一条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很多次,当前读直接读最新值

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

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

相关文章

Python函数绘图与高等代数互溶实例(二): 闪点函数

Python函数绘图与高等代数互溶实例(一):正弦函数与余弦函数 Python函数绘图与高等代数互溶实例(二):闪点函数 Python函数绘图与高等代数互溶实例(二):设置X|Y轴|网格线 一: 函数plot(),展示变量的变化趋势 import numpy as np import matplotlib.pyplot as plt from pylab i…

商家收款一万手续费多少

目前微信和支付宝作为主流的支付平台&#xff0c;为商家提供了安全、便捷的支付解决方案。但是在正常情况下&#xff0c;商家需要向平台支付交易额0.6%至1%不等的手续费&#xff0c;这个费率看似很少&#xff0c;但长期积累下来的手续费支出也是一笔不小的开支。 什么是收款手…

复习Day01:数组part01:701. 二分查找、35. 搜索插入位置、367. 有效的完全平方数、69. x的平方根、74. 搜索二维矩阵

之前的blog链接&#xff1a;https://blog.csdn.net/weixin_43303286/article/details/131690654?spm1001.2014.3001.5501 我用的方法是在leetcode再过一遍例题&#xff0c;明显会的就复制粘贴&#xff0c;之前没写出来就重写&#xff0c;然后从拓展题目中找题目来写。辅以Lab…

UI设计和平面设计的区别是什么?看完这篇一次搞懂

很多想要从事视觉领域工作的新手设计师&#xff0c;搞不懂UI设计和平面设计的区别&#xff1b;也有很多平面设计师工作后想转UI&#xff0c;却不知道该如何进行&#xff0c;导致择业和职业发展受阻&#xff0c;其实核心问题还是因为没有弄清楚UI设计和平面设计的区别是什么。 …

电工-三极管主要参数(直流、交流、极限)

三极管主要参数&#xff08;直流、交流、极限&#xff09; 三极管的主要参数分为三种&#xff0c;即直流参数、交流参数和极限参数&#xff0c;下面分别介绍&#xff1a; 直流参数 共发射极直流放大倍数βIc/Ib 集电极—基极反向截止电流Icbo&#xff0c;Ic0时&#xff0c;…

浅谈终端安全接入

前言&#xff1a; 随着网络的发展&#xff0c;现代企业大多都会部署企业的有线网络与无线网络&#xff0c;在传统的企业网内&#xff0c;随着越来越多的终端设备接入到公司网络&#xff0c;管理人员控制和审计外部用户接入的企业办公网的难度和工作量也越来越大。而如果允许外…

代码随想录二刷Day 15

102. Binary Tree Level Order Traversal vector<int>() it is basically constructor of std::vector class and will create a new empty vector. You can also mention the size of required vector in brackets. 访问二维vector的元素: 如果指定外层和内层向量的大…

技术贴 | 深度解析 PostgreSQL Protocol v3.0(二)— 扩展查询

引言 PostgreSQL 使用基于消息的协议在前端&#xff08;客户端&#xff09;和后端&#xff08;服务器&#xff09;之间进行通信。该协议通过 TCP/IP 和 Unix 域套接字支持。 《深度解析 PostgreSQL Protocol v3.0》系列技术贴&#xff0c;将带大家深度了解 PostgreSQL Protoc…

Matter 是什么?

Matter&#xff08;物联网Matter&#xff09;旨在成为一个可互操作的标准&#xff0c;促进技术采用和创新&#xff0c;逐渐取代智能家居生态系统的专有协议。 Matter采用一个开源的软件开发工具包&#xff08;SDK&#xff09;&#xff0c;其中包含了协议规范的实现&#xff0c…

如何低成本、低门槛开发全屋智能系统?

近期&#xff0c;某个科技通讯巨头豪掷 15 亿重金&#xff0c;准备成立房地产公司以大力推动全屋智能的发展。从大部分科技公司频频押注全屋智能领域来看&#xff0c;全屋智能已然成为智能家居第一大发展趋势&#xff0c;是资本市场的重头戏。 但全屋智能并不好做&#xff0c;…

【Linux】详解线程第一篇——由单线程到多线程的转变

线程详解 前言正式开始啥是线程理解线程Windows和Linux下的线程Windows下的线程Linux下的线程对比 重新理解进程理解曾经写的代码 Linux的线程pthread库验证多线程在同一个进程中跑ps -aL线程资源线程切换成本低线程缺点线程异常线程等待pthread_create的第三个参数——回调函数…

MyBatis友人帐之ResultMap及分页

一、ResultMap 1.1查询为null问题 要解决的问题&#xff1a;属性名和字段名不一致 解决方案 方案一&#xff1a;为列名指定别名 , 别名和java实体类的属性名一致 . <select id"selectUserById" resultType"User">select id , name , pwd as passwor…

thinkphp8路由

thinkphp8已出来有好一段时间了。这些天闲来无事&#xff0c;研究了下tp8的路由。默认情况下&#xff0c;tp8的路由是在route\app.php的文件里。但在实际工作中&#xff0c;我们并不会这样子去写路由。因为这样不好管理。更多的&#xff0c;是通过应用级别去管理路由。假如项目…

【JDK 8-函数式编程】4.4 Supplier

一、Supplier 接口 二、实战 Stage 1: 创建 Student 类 Stage 2: 创建方法 Stage 3: 调用方法 Stage 4: 执行结果 一、Supplier 接口 供给型 接口: 无入参&#xff0c;有返回值&#xff08;T : 出参类型&#xff09; 调用方法: T get(); 用途: 如 无参的工厂方法&#x…

多频超声波清洗机有什么特点?使用需要注意什么?

多频超声波清洗机是指具备多个频率可调的超声波发生器的清洗机&#xff0c;是在一只清洗槽内&#xff0c;安装有两种或三种以上不同频率的超声波换能器&#xff0c;由多只发生器分别推动各自频率的超声波进行清洗。传统的超声波清洗机通常只能在固定的频率下工作&#xff0c;而…

口袋参谋:新品上架如何做市场调查?这个方法超实用

很多商家在新品上架之前&#xff0c;都会对宝贝的市场行情进行调查分析&#xff0c;只有了解指定关键词下的行业市场数据&#xff0c;了解消费者需求,才能针对性的进行卖货。 可是我们要是人工一点点去搜集&#xff0c;一点点去翻找&#xff0c;很多数据是没法进行人工去统计的…

JavaScript - canvas - 选择部分区域的图像数据

效果 示例 项目结构&#xff1a; 源码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>选择部分区域的图像数据</title><style type"text/css">div {width: 200px;height: 200px;di…

基于图的基础推荐方式

文章目录 1. 基于图的基础推荐方式1.1 链路预测&#xff08;Link Prediction&#xff09;1.2 什么是路径1.3 基于路径的基础链路预测1.4 图游走算法DeepWalk1.4.1 Word2Vec1.4.2 DeepWalk原理1.4.3 DeepWalk代码示例 1.5 图游走算法Node2Vec1.5.1 Node2Vec原理1.5.2 Node2Vec公…

浅谈电动汽车充电桩设计与应用研究

安科瑞 华楠 摘要&#xff1a;目前&#xff0c;随着我国社会经济的快速发展&#xff0c;我国的各个领域都取得了突破性的发展&#xff0c;尤其是在电动汽车充电桩的设计方法&#xff0c;新型的电动汽车充电桩设计已经广泛的受到了人民群众的青睐与认可&#xff0c;而这种发展前…

基于FFmpeg+SDL的视频播放器的制作

基于FFmpegSDL的视频播放器的制作 基于FFmpegSDL的视频播放器的制作实验1实验2 基于FFmpegSDL的视频播放器的制作 雷霄骅博士的课程。 课程链接&#xff1a;https://blog.csdn.net/leixiaohua1020/article/details/47068015 初学 FFmpeg&#xff0c;记录一下过程。 实验1 答…