1.mysql架构图
2.mysql存储引擎比较:
| MyISAM | InnoDB | |
|---|---|---|
| 最小粒度行表锁 | 表锁,即使操作一条记录也会锁住整个表,不适合高并发的操作 | 行锁,操作时只锁某一行,不对其它行有影响,适合高并发的操作 |
| 是否支持事务 | N | Y |
| 是否支持外键 | N | Y |
| select count(*)效率 | 快 | 慢(全表扫描) |
3.索引类型:
聚集索引,非聚集索引
主键索引(聚集索引),普通索引,联合索引,唯一索引
B+树的数据结构(多路平衡查询树):减少访问磁盘的次数,尽量让固定大小的磁盘放下尽可能多的索引数据,单个索引越小越好(所以放弃了b-树),把真实的数据都放在叶子结点,也利于范围查询,索引的最左匹配原则也和此数据结构有关
一颗b+树一般存储2千万级别的索引:
InnoDB的存储单元是页 16k = 16384字节
假设一行真实数据大小为1k,叶子结点(一页)可以存储16行数据,
非叶子结点(一页)存储索引,假设索引为bigint类型,也就是8字节,加上指针大小是6字节,16384/(14)= 1000
则一颗2层高的树可以存储 161000=1.6w条数据 一棵三层高的树可以存储 161000*1000 = 1600w条数据
4.创建索引的情况:
哪些情况需要创建索引
- 主键自动建立唯一索引
- 频繁作为查询条件的字段
- 查询中与其他表关联的字段,外键关系建立索引
- 单键/组合索引的选择问题,高并发下倾向创建组合索引
- 查询中排序的字段,排序字段通过索引访问大幅提高排序速度
- 查询中统计或分组字段
哪些情况不要创建索引
- 表记录太少
- 经常增删改的表
- 数据重复且分布均匀的表字段,只应该为最经常查询和最经常排序的数据列建立索引(如果某个数据类包含太多的重复数据,建立索引没有太大意义)
- 频繁更新的字段不适合创建索引(会加重IO负担)
- where条件里用不到的字段不创建索引
5.覆盖索引,回表
6.隔离级别
三个现象:脏读,不可重复读,幻读
四个隔离级别:读未提交,读已提交,可重复读,串行化
事务的四大特性:ACID,原子性,一致性,隔离性,持久性
原子性:undolog来保证,记录逻辑操作记录,要么同时成功,有一个失败则根据undolog全部回滚 隔离性:mysql有四种隔离级别,mysql自己加锁来实现(mvcc) 持久性:redolog来保证,记录物理操作,mysql突然挂了,也可以通过日志来进行恢复 一致性:通过前面3个特性来保证,事务最终的目的
6.1mysql日志
binlog:mysql的主从复制利用了 bin log的特性,bin log还用于mysql数据恢复,属于逻辑日志(逻辑日志:记录更新的sql语句,物理日志:)
undolog:主要记录了数据的逻辑变化,记录可以反向恢复的逻辑sql,属于引擎层,innodb
redolog:物理日志,在事务提交时,只记录修改的数据页(因为日志文件相对更小并且在物理层上是连续的),归属于innodb存储引擎
重点理解
二阶段提交:
1.redolog的prepare
2.biglog的写入
3.redolog的commit
先写入日志,再落磁盘是保证mysql速度的关键
7.mysql的锁
行锁,表锁
读锁,写锁
8.mvcc介绍
背景:在保证一致性的前提下,做到读写并行,提高读写性能 原理:在每行数据有两列隐藏的字段,分别是数据最后更改的版本idDB_TRX_ID(记录着当前ID)以及 指向上一个版本数据的指针DB_ROLL_PTR,每次开启事务都会有一个唯一全局自增的事务id
读已提交和可重复读可以通过比较数据版本号码,来实现隔离级别
幻读:可以通过当前读来解决(注意幻读的概念定义)
快照读:每次读之前都去获取当前活跃着的事务的事务号合集 当前读:只会在事务开启前去获取当前活跃着的事务的事务号合集