-
MySQL
-
索引
-
B+树
-
B+树索引
-
聚簇索引(主键索引)
- 数据行本身就存储在索引的叶子节点里,索引和数据是同一个东西,不分离。
-
辅助索引(二级索引)
-
叶子节点不存完整数据,只存索引列的值 + 对应的主键值。
-
什么是回表?
-
-
联合索引
-
联合索引就是把多个列组合在一起,建成一个索引。
-
什么是最左前缀原则
-
-
覆盖索引
-
B+树索引的分裂
-
B+树索引的管理
-
索引下推
-
-
全文索引
-
哈希索引
-
空间索引
-
索引优化
-
索引失效的原则
-
-
锁
-
一、锁的类型
-
行级锁
-
共享锁 S锁
-
排他锁 X锁
-
-
表级锁
-
意向共享锁 IS
-
意向排他锁 IX
-
-
锁兼容矩阵
-
-
二、InnoDB 三种锁算法
-
Record Lock 记录锁
-
Gap Lock 间隙锁
-
Next-Key Lock 临键锁
-
-
三、一致性非锁定读
-
读提交 RC
-
可重复读 RR
-
-
四、一致性锁定读(当前读)
-
SELECT … FOR UPDATE
-
SELECT … LOCK IN SHARE MODE
-
INSERT / UPDATE / DELETE
-
-
五、自增锁 AUTO-INC Lock
-
innodb_autoinc_lock_mode
-
0 传统模式
-
1 连续模式
-
2 交错模式
-
-
-
六、外键与锁
-
七、锁的问题
-
脏读
-
不可重复读
-
幻读
-
丢失更新
-
-
八、死锁
-
检测机制
-
处理策略
-
预防策略
-
-
-
表
-
一、索引组织表
-
主键的选择规则
-
_rowid 查看主键
-
-
二、InnoDB 逻辑存储结构
-
表空间 Tablespace
-
系统表空间
-
独立表空间 innodb_file_per_table
-
-
段 Segment
-
数据段
-
索引段
-
回滚段
-
-
区 Extent
-
大小固定 1MB
-
由 64 个页组成
-
-
页 Page
-
默认 16KB
-
页的类型
-
数据页
-
Undo 页
-
系统页
-
事务数据页
-
插入缓冲位图页
-
插入缓冲空闲列表页
-
未压缩二进制大对象页
-
压缩二进制大对象页
-
-
-
行 Row
-
-
三、InnoDB 行记录格式
-
Compact 格式
-
变长字段长度列表
-
NULL 标志位
-
记录头信息
-
列数据
-
-
Redundant 格式(旧格式)
-
行溢出数据
-
VARCHAR 溢出
-
BLOB 溢出
-
-
Compressed / Dynamic 格式
-
-
四、InnoDB 数据页结构
-
File Header 文件头
-
Page Header 页头
-
Infimum + Supremum
-
User Records 用户记录
-
Free Space 空闲空间
-
Page Directory 页目录
-
File Trailer 文件尾
-
-
五、约束
-
数据完整性
-
实体完整性
-
主键约束
-
唯一键约束
-
-
域完整性
-
数据类型约束
-
DEFAULT 约束
-
NOT NULL 约束
-
-
参照完整性
- 外键约束 FOREIGN KEY
-
-
约束的创建方式
-
建表时定义
-
ALTER TABLE 添加
-
-
约束与索引的区别
-
ENUM 和 SET 约束
-
触发器与约束
-
外键约束
-
CASCADE
-
SET NULL
-
NO ACTION / RESTRICT
-
-
-
六、视图
-
虚表,不存储数据
-
用途
-
简化查询
-
权限控制
-
数据抽象
-
-
物化视图(MySQL 不原生支持)
-
-
七、分区表
-
分区类型
-
RANGE 分区
-
LIST 分区
-
HASH 分区
-
KEY 分区
-
COLUMNS 分区
-
-
子分区
-
分区与 NULL 值处理
-
分区的性能优化
- 分区裁剪 Partition Pruning
-
分区的限制
-
-
-
文件
-
一、参数文件
-
参数类型
-
动态参数
-
静态参数
-
-
-
二、日志文件
-
错误日志 Error Log
-
慢查询日志 Slow Query Log
-
查询日志 General Log
-
二进制日志 Binlog
-
-
三、Socket 文件
-
四、PID 文件
-
五、表结构文件
- .frm 文件
-
六、InnoDB 存储引擎文件
-
表空间文件
-
系统表空间
-
独立表空间
-
通用表空间
-
临时表空间
-
-
重做日志文件 Redo Log
-
-
-
备份与恢复
-
一、备份类型
-
按备份方式
-
热备 Hot Backup
-
温备 Warm Backup
-
冷备 Cold Backup
-
-
按备份内容
-
完全备份 Full Backup
-
增量备份 Incremental Backup
-
差异备份 Differential Backup
-
-
按备份文件格式
-
逻辑备份
-
裸文件备份
-
-
-
二、逻辑备份
-
mysqldump
-
SELECT INTO OUTFILE
-
mydumper
-
-
三、裸文件备份
-
ibbackup
-
XtraBackup
-
-
四、二进制日志备份
-
Binlog 备份
-
配合全量备份做增量恢复
-
-
五、复制备份
-
主从复制
-
在从库上做备份
-
-
六、快照备份
-
LVM 快照
-
存储层快照
-
-
七、恢复
-
完全恢复
-
基于时间点恢复 Point-in-Time
-
基于位置恢复
-
-
八、备份策略
-
RTO 恢复时间目标
-
RPO 恢复点目标
-
全量 + 增量组合策略
-
-
-
复制
-
一、复制原理
-
Binlog 主从同步流程
-
三个线程
-
主库 Binlog dump 线程
-
从库 IO 线程
-
从库 SQL 线程
-
-
-
二、复制模式
-
异步复制
-
半同步复制
-
全同步复制
-
-
三、复制格式
-
STATEMENT
-
ROW
-
MIXED
-
-
四、复制拓扑
-
一主一从
-
一主多从
-
级联复制
-
双主复制
-
-
五、GTID 复制
-
全局事务标识符
-
优点
-
配置方式
-
-
六、并行复制
-
库级别并行
-
组提交并行
-
-
七、复制延迟
-
产生原因
-
监控方式
-
解决方案
-
-
八、复制常见问题
-
主从数据不一致
-
复制中断处理
-
跳过错误
-
-
-
InnoDB 存储引擎
-
一、InnoDB 体系架构
-
内存池
-
缓冲池 Buffer Pool
-
重做日志缓冲 Redo Log Buffer
-
额外内存池
-
-
后台线程
-
Master Thread
-
undo页回收
-
脏页刷新
-
合并插入缓冲
-
-
IO Thread
-
使用AIO进行处理IO请求
-
什么是AIO,他和NIO,BIO的区别是什么?
-
AIO
- 异步非阻塞IO
-
NIO
- 异步阻塞IO
-
BIO
- 同步阻塞IO
-
-
为什么在Java开发中使用NIO较多,而不是AIO
-
web开发网络IO为主,NIO已经能满足高并发场景
-
Java的AIO实现不是真正的异步非阻塞IO,使用线程池模拟这个过程 实际上底层还是同步阻塞IO (worker线程),线程数量和IO数量授权线程池大小限制
-
主流生态上NIO为主
-
-
-
Purge Thread
- 回收undolog ,在innodb1.1之前是在master Thread上进行的
-
Page Cleaner Thread
- 1.2版本引入,回刷脏页数据到磁盘
-
-
-
二、内存
-
缓冲池 Buffer Pool
-
数据页
-
索引页
-
插入缓冲
-
自适应哈希索引
-
锁信息
-
数据字典
-
主要用与填补cpu速度和磁盘速度的鸿沟,读取和操作时候优先通过缓冲池中的数据页数据操作,通过checkpoint机制回刷磁盘
-
什么是checkpoint?
-
Sharp CheckPoint
-
一次性回刷所有脏页数据到磁盘
-
已不在使用,容易阻塞
-
-
Fuzzy CheckPoint
-
每次回刷只刷部分,不是全部
-
触发方式
-
Master Thread CheckPoint 定期回刷
-
FLUSH_LRU_LIST CheckPoint LRU空闲页不够时候会淘汰一些页,如果是脏页会先刷盘再淘汰
-
Async/Sync Flush Checkpoint
-
当redo log 快被写满时候的保护机制
-
Async Flush
-
细分主题 2
-
-
-
-
-
-
-
-
LRU 算法
-
传统 LRU
-
InnoDB 改进 LRU(midpoint)
-
-
Flush 链表
-
Free 链表
-
重做日志缓冲
-
额外内存池
-
-
三、Checkpoint 技术
-
作用
-
Sharp Checkpoint
-
Fuzzy Checkpoint
-
Master Thread Checkpoint
-
FLUSH_LRU_LIST Checkpoint
-
Async/Sync Flush Checkpoint
-
Dirty Page too much Checkpoint
-
-
-
四、Master Thread 工作方式
-
每秒操作
-
每十秒操作
-
InnoDB 1.2.x 版本优化
-
-
五、InnoDB 关键特性
-
插入缓冲 Insert Buffer
-
条件
-
Change Buffer
-
内部实现
-
合并时机
-
-
两次写 Double Write
-
作用
-
实现原理
-
-
自适应哈希索引 AHI
-
异步 IO
-
刷新邻接页
-
-
六、启动、关闭与恢复
-
innodb_fast_shutdown
-
innodb_force_recovery
-
-
-
查询
-
为什么查询速度会慢
-
慢查询基础:优化数据访问
-
是否请求了不需要的数据
-
是否扫描了额外的记录
-
-
重构查询的方式
-
一个复杂查询 vs 多个简单查询
-
切分查询
-
分解联接查询
-
-
查询执行的基础
-
客户端/服务器通信协议
-
查询状态
-
查询优化处理
-
查询执行引擎
-
将结果返回给客户端
-
-
查询优化器的局限性
-
UNION 的限制
-
等值传递
-
并行执行
-
在同一个表中查询和更新
-
-
优化特定类型的查询
-
优化 COUNT()
-
优化联接查询
-
优化 GROUP BY
-
优化 LIMIT 和 OFFSET
-
优化 UNION
-
-
一条sql查询语句是如何执行的?
-
连接器
- 负责服务端与客户端建立连接,验证密码是否正确,是否有权限
-
分析器
- 对要进行执行的SQL语句进行词法分析和语法解析
-
优化器
- 决定使用哪个索引,还有类似join时刻表的连接顺序等
-
执行器
- 真正执行这个sql语句,如果没有权限会拦截掉
-
-
一条Update语句是怎么执行的?
-
执行顺序
-
执行器先去引擎中找到对应的行
-
找到对应的行之后进行计算处理
-
引擎将这部分数据记录到内存中,同时记录redo log 状态为prepare,告知执行器执行结束
-
执行器生成binlog写入磁盘
-
执行器调用引擎提交事务的接口,修改redo log的状态为commit
-
-
什么是redo log
-
这是物理日志.InnoDB特有,redo log记录了对于哪个数据页进行修改,同时保证脏页能够及时回刷到磁盘中(两阶段提交) 有大小限制,写策略是循环写
-
什么是脏页?
-
内存中与磁盘数据不一致的部分
-
在InnoDB中,数据的读取是按照页(page)进行,读取一行数据时候会将这行数据整页的方式进行读入
-
-
-
什么是bin log
- 这是逻辑日志,MySQL的server实现的,记录了每一行数据的执行逻辑,默认无大小限制,写策略是追加写
-
什么是两阶段提交
-
redo log 的两种状态,prepare和commit 保证宕机后数据可以正确恢复
-
为什么两阶段提交可以保证数据可以被正确恢复?
- 两阶段提交吧是否提交成功变成了 可重放,可判定的状态机,不依赖内存状态 我理解的正确恢复主要有三件事 1:已提交事务不丢失 2:未提交事务不生效 3:引擎存储数据和binlog一致(保证主从同步的数据一致性) 两阶段提交的原理为 1 写redo log prepare (落盘) 2 写 binlog 落盘 3 写 redo log commit 落盘 如果崩溃发生在3阶段: 事务已经提交 如果崩溃发生在2阶段:事务可以提交 如果崩溃发生在1阶段:事务回滚 binlog如果写入磁盘即可保证主从一致性 两阶段提交主要解决 redolog 以及 binlog的一致性
-
-
为什么要有两份日志
- redo log 和 binlog 的职能不同 redo log:给 InnoDB 自己用(本地崩溃恢复)主要解决的问题是内存数据没有回刷到磁盘的问题 binlog:给MySQL的server层使用,逻辑变更日志可以回放当时业务操作,由于是追加写入可长期保存归档 redo log 设计太底层,并且由于覆写限制无法实现归档/复制 binlog 是逻辑日志,无法处理引擎页级崩溃恢复设计,不能替代redo的快速本地恢复能力
-
-
-
I事务
-
一、认识事务
-
事务的分类
-
扁平事务
-
带有保存点的扁平事务
-
链事务
-
嵌套事务
-
分布式事务
-
-
-
二、事务的实现
-
原子性 A
-
持久性 D
-
隔离性
-
事务的四种隔离级别是什么
-
读未提交
- 一个事务还没提交时,它做的变更就能被别的事务看到
-
读已提交
- 一个事务提交之后,它做的变更才会被其他事务看到。
-
可重复读
- 一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。当然在可重复读隔离级别下,未提交变更对其他事务也是不可见的
-
串行化
- 对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。
-
-
事务的四种隔离级别解决什么问题
-
读未提交
-
读已提交
- 脏读
-
可重复读
- 不可重复读,不分幻读
-
串行化
- 幻读
-
-
什么是脏读,幻读,不可重复读
-
脏读:读到了别人还没提交的数据(对方回滚后,你读到的是“脏”的)。
-
不可重复读:同一事务里,两次读同一行,结果不一样(别人中间提交了更新)。
-
幻读:同一事务里,两次按条件查询,第二次多/少了几行(别人中间插入/删除了满足条件的行)。
-
-
四种隔离级别实现原理
-
可重复读:执行事务前创建一个视图,访问的时候以视图的逻辑结果为主,整个事务期间都会使用这个视图
-
读已提交:视图在SQL执行前开始创建
-
读未提交:直接返回记录的最新值
-
串行化:对于记录进行加锁
-
-
为什么可重复读不能解决幻读的问题,如何解决
-
快照读
- 普通select语句,通过MVCC方式解决了幻读
-
当前读
-
select for update 语句,此类语句会跳过视图,直接读记录
-
解决方案:需要通过间隙锁和 Next-Key Lock解决,这是InnoDB在可重复读的级别下额外引入的机制
-
间隙锁
- 锁住一个范围内的”空隙”,阻止其他事务在这个范围内插入新行
-
Next-Key Lock
- 行锁 + 间隙锁,锁住行本身及其前面的间隙
-
为什么单纯的间隙锁无法解决幻读?
- 间隙锁锁的是开区间的记录,不包含端点(记录本身) 间隙锁之间不互斥,两个事务可以同时持有同一个间隙的间隙锁。 间隙锁的设计目标是”阻止插入”,而不是”互斥访问” 间隙锁可以解决 防止插入新行 不能解决 防止修改已有行,单独解决幻读
-
-
-
-
-
一致性 C
-
-
三、Redo Log
-
组成
-
Redo Log Buffer
-
Redo Log File
-
-
写入策略
- innodb_flush_log_at_trx_commit
-
-
四、Undo Log
-
作用
-
事务回滚
-
MVCC 多版本读
-
-
类型
-
Insert Undo Log
-
Update Undo Log
-
-
Purge 线程清理
-
-
五、事务控制语句
-
BEGIN / COMMIT / ROLLBACK
-
SAVEPOINT
-
SET TRANSACTION
-
-
六、隐式提交的 SQL
-
七、事务隔离级别
-
READ UNCOMMITTED
-
READ COMMITTED
-
REPEATABLE READ
-
SERIALIZABLE
-
-
八、分布式事务
-
XA 事务
-
两阶段提交
-
-
九、长事务
-
危害
-
如何避免
-
-
-