MySQL总结


通过以上几篇文章分别介绍了MySQL的文件系统/索引/锁/事务等功能点,这篇文章将对这些知识点进行汇总,描述出MySQL大概的架构

文件数据

MySQL在文件数据上可以划分为MySQL系统数据/存储引擎数据

  • 文件数据
    • 系统文件
    • 参数文件
      参数文件指的是系统运行时的参数,主要分为’静态参数’和’动态参数’
    • 日志文件
    • 系统错误日志文件
    • 二进制(binlog)
      binlog目前有三种记录格式分别是STATEMENT/ROW/MIXED;RC和STATEMENT格式不兼容,因为binlog的是在事务进行提交时写入
    • 慢查询日志
    • 查询日志
    • 套接字文件
      套接字文件是UNIX下使用套接字链接方式打开的socket文件
    • pid文件
    • 表结构文件
      定义表结构的文件,每个表都有一个frm的表结构文件
  • InnoDB存储引擎文件
    • 表空间文件
      实际存储数据的文件,名称为ibdata1的文件作为共享表空间文件,MySQL也支持为每个表单独设置表空间文件,后缀名为.ibd
    • redolog
      redoLog又称为重做日志,文件名称为ib_logfile0/ib_logfile1

cESwqK.png

索引系统

MySQL的索引系统主要是由于B+ Tree索引作为底层数据结构,也有采用Hash自适应索引场景.

  • 索引
    • 分类
      • B+Tree索引
        B+ TREE索引作为MySQL底层数据结构的好处是在于B+TREE平衡且层级不高并且叶子节点可以作为聚集索引
      • 全文索引
        MySQL的全文索引也是采用倒排算法,通过关键字来进行文档映射,现实工作中未涉及到,因此未详细研究
      • Hash索引
        InnoDB只支持自适应的Hash索引,不能显示的去创建并且要满足Hash索引自动创建的条件(等值查询/命中范围/查询频率)

    • 锁分类
      • 行级锁
        • 共享锁(S锁)
          共享锁允许事务同时读取同一行数据
        • 排他锁(X锁)
          排他锁是独占锁,不允许其他事务读取或操作数据
      • 表锁
        • 意向共享锁(IS锁)
          意向共享锁是表维度的锁,意向共享锁是在事务读取表中某行数据时候自动加上的,同理意向排他锁也是这个逻辑;设计意向锁的主要目的是在于当事务想要获取到表锁时,可以直接通过是否能获取到意向锁来判断,相当于一个表级别的锁标志
        • 意向排他锁(IX锁)
      • 锁算法
        • 行锁
          行锁的作用范围是对数据的某一行进行操作
        • 间隙锁
          间隙锁是对数据间隙进行上锁,这样可以防止数据出现幻读的情况
        • Next-Key Lock
          行锁+间隙锁就是Next-Key Lock
        • 锁降级
          当发现可以用行数时,Next-Key会降级成行锁

事务

  • 事务
    • 事务的隔离级别
      • 串行化(Serializable)
      • 读未提交(Read Uncommitted)
      • 读已提交(Read Committed)
      • 可重复读(Repeatable Read)
    • 串行化
      串行化指的是事务按照串行化执行的结果执行,InnoDB的串行化是通过增加读锁的方式来实现的
    • 读未提交
      读未提交指的是当前事务可以读取到其他事务尚未提交的数据,底层实现是当前事务直接返回记录上的最新值
    • 读已提交
      读已提交指的是事务中的SQL在执行时会去读取最后一次提交的数据信息
    • 可重复读
      可重复读指的是事务开始时会分配一个全局唯一且自增的事务ID,并且可重复读只能读取到小于等于该事务id的数据;快照数据是通过UNDO LOG实现的

  TOC