mysql技术分享

147 阅读2分钟

一、mysql体系结构

  1. 连接层:管理连接,认证授权
  2. 服务层:
    • 解析器 sql语句解析(词法,语法)-->解析树
    • 优化器 生成执行计划、基于成本的索引选择 -->执行计划
    • 执行器 操作存储引擎、返回结果 -->查询结果
    开启执行优化器追踪
    SHOW VARIABLES LIKE 'optimizer_trace';
    set optimizer_trace='enabled=on'
    
  3. 存储引擎:为server层提供读写接口
    • InnoDB: 5.1开始作为默认存储引擎,行锁,支持事务
    • MySIAM:表级别的锁,不支持事务
    • Archive:只支持select 和insert 操作,数据压缩率高,适用于日志和数据采集场景
    • Memory:基于内存存储,hash索引查询快,重启数据丢失,查询过程中的临时表就是使用memory引擎(结果太大或含有text和blob数据时是innoDB)

二、了解一下InnoDB

  1. InnoDB内存中的结构

    • Buffer Pool
    读:把磁盘数据读取到的数据以页为单位缓存到内存中,下一次读取相同页数据直接查询缓存。
    写:写数据时先修改缓存中的页,后通过后台线程写入磁盘(刷脏页)。
    
    
    • Change Buffer(Buffer Pool中的一部分)
     不需要唯一性检查的数据直接写Change Buffer。
     merge到磁盘的几种情况 “访问该数据页”、“后台线程”、“数据库shutdown”、“redo log写满”
    
    • AdaptiveHashIndex(Buffer Pool中的一部分)
    这个区域就是对内存区域数据的索引
    
    • log buffer(redo)
    redo log的缓冲文件,先写入缓存后续刷盘到redolog中
    刷盘时机 SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit'; 
    0 延迟写,每秒刷盘一次(每秒由buffer 写到磁盘)
    1 实时写、实时刷 每次提交事务都会刷盘(commit时直接写到磁盘)
    2 实时写、延时刷  每次提交都写到操作系统os cache,刷盘由os进行
    
    • 锁在内存中的存储
  2. log文件

    • binlog (server层)
    server层的日志文件
    记录所有DDL 和DML的语句,属于逻辑日志,可以用来作为主从复制和数据恢复
    
    
    • redo(innoDB)
    重做日志,提供了crash-safe的能力,记录的是数据页做了什么改动,属于物理日志
    日志写入到redo之后就可以保证数据不丢失
    
    • undo(innoDB)
    innodb实现事务的日志,也用于mvcc的快照读