Mysql执行过程
Mysql的log日志介绍
- redolog
作用:保证了数据内部的安全性,延迟刷盘实际,进而提升系统吞吐
① 为InnoDB提供了崩溃恢复的特性,实现持久性
② redolog记录的是 在某个数据页上做了什么修改,属于物理日志
③ redolog的大小是固定的,前面的内容会被覆盖,一旦写满,就会触发buffer pool到磁盘的同步,以便腾出空间记录后面的修改 - undolog
记录事务发生之前的数据状态。发生异常时回滚,保证原子性
比如一条数据更新的流程,把a改成b
① 事务开始,从内存(buffer pool)或磁盘(data file)取到包含这条数据的数据页,返回给server执行器
② Server的执行器修改数据页的这一行数据值为b
③ 记录name=a 到 undolog
④ 记录name=b 到 redolog
⑤ 调用存储引擎接口,记录数据页到Buffer Pool(修改name=b)
⑥ 事务提交 - binlog binlog是以事件的形式记录了所有的DDL和DML语句,可以用来做主从复制和数据恢复
在崩溃恢复时,判断事务是否需要提交
① binlog无记录,redolog无记录:在redolog写之前crash,恢复操作:回滚事务
② binlog无记录,redolog状态是prepare:在binlog写完之前crash,恢复操作:回滚事务
③ binlog有记录,redolog状态是prepare:在binlog写完提交事务之前的crash,恢复操作:提交事务
④ binlog有记录,redolog状态是commit:正常完成的事务,不需要恢复
Mysql的索引介绍
索引是数据库管理系统(DBMS)中一个排序的数据结构,以借助快速查询、更新数据库表中数据。这样就需要查询速度快的数据接口来存储
B+Tree的特点
① 关键字数量和分叉树(度)是相等的
② 内节点不存储数据,数据在叶子节点
③ 叶子节点之间,形成有序链表(双向链表)
B+Tree的优势
① BTree能解决的问题,B+Tree都能解决
② 扫库、扫表能力更强
③ 磁盘读写能力更强(I/O次数更少,深度更低)
④ 排序能力更强(叶子节点/双向链表)
⑤ 效率更加稳定
索引分类
- 聚集索引 叶子节点放完整的记录,索引键值顺序与数据行的物理存储顺序一致
- 二级索引
叶子节点存放键值和主键的值
什么字段可以做聚集索引?
- 有主键,使用主键
- 无主键,但存在不包含null值的唯一索引,那么会取第一个这样的索引当聚集索引
- 无主键,无唯一索引,使用隐藏列 row_id做聚集索引
索引建立的参考建议
- 在用于where判断,order排序,join的on、group by字段上创建索引
- 索引的个数不要过多
- 区分度低的字段,例如性别,不要建立索引
- 频繁更新的值,不要作为主键或者索引
- 不建议用无序的值(身份证/UUID)作为索引
- 复合索引把区分度高的值放在前面
- 创建复合索引,而不是修改单列索引
- 过长的字段,建立前缀索引
什么时候用不到索引
- 索引列上使用函数表达式
- 字符串不加引号,出现隐式转换
- like条件中,前面带%(除了索引下推)
- 反向查询,<>,!=,not in等,并不是都用不到索引
优化器如何选择索引?
InnoDB是基于成本的优化器,每种情况记录成本,最后选择成本最小的路径来执行;
具体走不走索引,看优化器的选择;不是绝对的;