加锁规则
-
原则1:加锁的基本单位是next-key lock。希望你还记得,next-key lock是前开后闭区间。
-
原则2:查找过程中访问到的对象才会加锁。
-
优化1:索引上的等值查询,给唯一索引加锁的时候,next-key lock退化为行锁。
-
优化2:索引上的等值查询,向右遍历时且最后一个值不满足等值条件的时候,next-key lock退化为间隙锁。
-
一个bug:唯一索引上的范围查询会访问到不满足条件的第一个值为止。
InnoDB:redo log Write-Ahead Logging:缓冲区
binlog:mysql server层
这两种日志有以下三点不同。
-
redo log是InnoDB引擎特有的;binlog是MySQL的Server层实现的,所有引擎都可以使用。
-
redo log是物理日志,记录的是“在某个数据页上做了什么修改”;binlog是逻辑日志,记录的是这个语句的原始逻辑,比如“给ID=2这一行的c字段加1 ”。
-
redo log是循环写的,空间固定会用完;binlog是可以追加写入的。“追加写”是指binlog文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。
由于唯一索引用不上change buffer的优化机制,因此如果业务可以接受,从性能角度出发建议优先考虑非唯一索引
redo log 主要节省的是随机写磁盘的IO消耗(转成顺序写),而change buffer主要节省的则是随机读磁盘的IO消耗
事务
mvcc(读)
read committed
版本链
readview m_ids:[活跃事务]
https://zhuanlan.zhihu.com/p/110263562
repeatable read
锁(写)
select不加锁
select *** lock in share mode
select *** for update
repeatable read
sql不走索引,写锁锁所有;
逻辑架构
1、查询缓存
2、解析器
3、预处理器
4、查询优化器
5、查询执行计划
6、执行引擎(存储引擎)
类加载过程包括加载、验证、准备、解析和初始化五个阶段
链接阶段要做的是将加载到JVM中的二进制字节流的类数据信息合并到JVM的运行时状态中,经由验证、准备和解析三个阶段。
查询缓存
show variables like '%query_cache%';
show status like '%Qcache%';
show status like '%Com_select%';
select version();
8.0开始移除
解析器
词法解析:语句分词,解析出关键字,函数名等token
语法解析:基本语法校验,比如关键词顺序,引号是否闭合
预处理器
表和列是否存在,字段别名是否有歧义,权限校验等
查询优化器
重排关联表顺序
等价变换
子查询优化
覆盖索引扫描
提前终止
查询执行计划
EXPLAIN
SHOW WARNINGS
存储引擎
InnoDB
所有数据存储叶子节点;存储有序
logmN
聚簇索引
表记录的物理存储顺序与索引顺序一致,且索引的叶子节点就是数据节点
非聚簇索引
表记录的物理存储顺序与索引顺序无关,叶子节点包含主键值(InnoDB——主键和索引值)或指向数据块的指针(MyISAM——数据库指针)
索引创建
where join group by order by
最左匹配
经常使用、区分度大(0.1)、宽度小
type类型
const、system:单行,主键or唯一
eq_ref:第二张表主键or唯一
ref:使用key最左前缀
range:范围
index:遍历索引,全表扫描
all:全表扫描
extra
using index:索引覆盖
using where :存储引擎返回数据再过滤
using temporary:临时表
using filesort:额外排序
InnoDB一棵B+树可以存放多少行数据
2千万
存储引擎最小存储单元——页,16k
16*1024=16384B
假设主键ID为bigint,8B,指针6B,则非叶子节点,单页可以存16384/14=1170个单元,一个单元指向一个具体存储数据的叶子结点,一条数据1k,那么叶子节点可以存放16条数据。
高度为2,则可以存放1170*16=18724条
高度为3,则可以存放1170*1170*16=21902400条
mongo用的是B树
https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
行格式
show variables like "%innodb_default_row_format%";