Mysql相关介绍

95 阅读3分钟

Mysql执行过程

image.png

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是基于成本的优化器,每种情况记录成本,最后选择成本最小的路径来执行;
具体走不走索引,看优化器的选择;不是绝对的;