2、MySQL总结

一、基础部分

(一)、概念

关系型数据库

(二)、SQL编写

CRUD(查询、插入、更新、删除)

左右连接、内连接、子查询

(三)、存储过程、存储函数

存储过程和函数(一)-CSDN博客

(四)、触发器

二、高阶部分

(一)、索引

  1. 索引底层结构

InnoDB行格式(行格式:一条记录的存储结构)

1.1. 变长字段长度列表

非必须,逆序存放

1.2. null值列表

非必须,逆序存放

1.3. 记录头信息

delete_mask:标示这条记录是否被删除

next_record:下条记录的位置

1.4. 真实数据

row_id:指定了主键或者唯一约束列(不包含null值的唯一列),则无row_id;非必需,占6字节。

trx_id:这条数据由哪个事务生成的;事务id,必须,占6字节。

roll_pointer:这条记录上个版本的指针,必须,占7字节。

  1. B树、B+树、二叉树、红黑树、Hash

B+🆚二叉树:相同的数据二叉树需要更多的IO次数,二叉树只有两个分支,存储相同的数据,树更高,IO次数更多;

B+🆚B树:B树非叶子节点也存放数据,B+树只存放索引,所以B+树单个节点的数据量更小,相同的IO次数,查询到更多的节点;B+树叶子节点间有双向链表,方便范围查询,B树没有;

红黑树:存放数据有限,只有二个分支,每个节点只存放一个数据;B+树高度更低,IO次数更少,检索速度更快;

Hash:只适合等值查询。

  1. 索引类型

数据结构:B+索引、Hash索引、全文索引

物理结构:聚簇索引(叶子节点保存了所有的记录)、非聚簇索引(叶子节点只保存主键,不保存完整记录)

字段特性:唯一索引、主键索引、普通索引、前缀索引

字段个数:联合索引、单列索引

  1. 覆盖索引

查询字段与联合索引一致,可以直接在非聚簇索引树的叶子结点上找到,无需回表(回表:拿着非聚簇索引树上找到的主键去聚簇索引树上找记录)。

如果一个索引包含(或者说覆盖)所有需要查询的字段的值。

  1. 索引下推

联合索引,对联合索引包含的字段先做判断,直接过滤掉不满足的记录,减少回表次数。

  1. 索引失效

函数计算、类型转换、最左匹配原则、like左匹配、不等于、where子句中的OR

(二)、事务

1、概念

要么不执行、要么全部执行,没有中间状态。

2、四大特性

原子性、隔离性、持久性、一致性(目的)

3、问题

脏读、不可重复读、幻读

4、隔离级别

读未提交、读已提交、可重复读(默认)、串行化

(三)、锁+MVCC(多版本并发控制)

1、锁

表锁:意向锁、自增锁(保持主键唯一自增)、元数据锁(当对一个表CRUD时,自动加读锁;表结构变更时,自动加写锁;读锁之间不互斥,写写、读写均互斥)

行锁:记录锁、间隙锁、临键锁、插入意向锁

页锁

乐观锁

显式锁、隐式锁

全局锁

死锁

2、MVCC

解决了脏读且不加锁:在读取时生成版本号,等到其他事务commit之后,才会读取最新已commit的版本号数据

RR+MVCC 解决了幻读

快照读🆚当前读

• 当前读:每次读取的都是当前最新的数据,但是读的时候不允许写,写的时候也不允许读。select....for update语句。

• 快照读:读写不冲突,每次读取的是快照数据。读已提交下,快照读和当前读读取的数据是一样的,都是最新的。RR下有可能读取的不是最新的数据。普通的select语句。

针对快照读:因为RR下只生成一个read view,事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的,即使中途有其他事务插入数据,是查询不出这条数据的。

针对当前读:是通过临键锁解决了幻读。因为当执行select....for update(插入X锁),会加上临键锁,如果有其他事务在临键锁范围内插入一条记录,那么这个插入语句会阻塞,无法成功插入,避免了幻读。

(四)、日志

redo log innodb存储引擎独有的,当mysql宕机时,读取redo log来故障恢复。

undo log 用于事务回滚操作,当事务执行时发生错误或者需要回滚操作时,执行undo log,恢复到事务开始前的状态。

binary log 数据备份,用于主备、主主、主从。

(五)、Explain工具

1、type

访问类型 由高到低排序 一般至少是range

system:表中只有一条数据且统计数据是精确的

const:表示通过索引一次就找到了。主键或唯一二级索引列,与常数进行等值匹配,对单表的访问。

eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描。

ref:非唯一性索引扫描,返回匹配某个单独值的所有行。普通的二级索引列与常量进行等值匹配。

range:范围区间的记录,in,key>'a' and key<'b',between

index:出现index是sql使用了索引但是没有通过索引进行过滤,一般是使用了覆盖索引或者是利用索引进行了排序分组。

all:全表扫描

2、key_len

主要针对联合索引,实际用到的索引长度

3、rows

预估要读取的记录数,越小越好

4、Extra

索引覆盖 using index;条件下推 using index condition;使用文件排序 using filesort

相关推荐
她说人狗殊途4 小时前
[特殊字符] MySQL性能参数查询总结
数据库·mysql
灵犀物润4 小时前
MySQL 8 与 PostgreSQL 17 对比分析及迁移指南
数据库·mysql·postgresql
二闹4 小时前
别再傻傻分不清!MyBatis两种分页方式到底用哪个?
后端·mysql
异世界贤狼转生码农5 小时前
Ubuntu操作系统下使用mysql、mongodb、redis
mysql·mongodb·ubuntu
跑跑快跑6 小时前
Macbook安装MySQL报错
数据库·mysql
小鸡脚来咯8 小时前
mysql mvcc机制详解
数据库·mysql
计算机学姐9 小时前
基于SpringBoot的老年人健康数据远程监控管理系统【2026最新】
java·vue.js·spring boot·后端·mysql·spring·mybatis
夏天的味道٥10 小时前
MySQL explain命令的作用
android·mysql·adb
DemonAvenger11 小时前
MySQL锁机制深度解析:从共享锁到排他锁的技术剖析与实战经验
数据库·mysql·性能优化
朱包林11 小时前
数据库服务-日志管理-备份与恢复-主从同步
linux·运维·服务器·数据库·mysql·云计算