存储架构图

MySQL整体架构 - 图1

整体架构图

image.png

Server层

主要功能

  • 内置函数:日期、时间、数学和加密函数等
  • 触发器、存储过程、视图等

    连接器

  • 负责跟客户端建立连接、获取权限、维持管理连接

  • 首先进行TCP握手,其次验证账号密码
  • 而后从权限表读取账号权限,这个连接里面的权限判断逻辑,都将依赖于此时读到的权限。
  • show processlist,查看数据库连接信息,Command列为Sleep表示是空闲连接
  • Sleep状态的连接,默认8小时断开,由参数wait_timeout控制
  • MySQL在执行过程中临时使用的内存是管理在连接对象里面的,这些资源会在连接断开的时候 才释放
  • Mysql5.7后,可以在每次执行一个比较大的操作后,通过执行 mysql_reset_connection来重新初始化连接资源。这个过程不需要重连和重新做权限验证, 但是会将连接恢复到刚刚创建完时的状态。

    查询缓存

  • 对于查询操作,会先到查询缓存中找结果,执行过的查询操作会以key-value的形式缓存在内存中,key是查询语句

  • 查询缓存失效非常频繁。对一个表的更新操作,会清空这个表的所有查询缓存
  • MySQL8.0删除了查询缓存这个模块
  • 手动关闭:

    • show variables like ‘query_cache_type’;
    • set global query_cache_type=’DEMAND’;

      分析器

  • 对SQL进行语法分析,识别每个字符串的含义

  • 语法分析器根据语法规则判断SQL语句是否符合MYSQL语法

    优化器

  • 优化sql执行,决定走哪个索引,join的顺序等

  • 可以使用force index() 强制走某个索引
  • 选择索引的判断标准:扫描行数、是否使用临时表、是否排序

    • 扫描行
      • 统计索引的“区分度”,即一个索引上不同值的个数,称为“基数”
      • show index from t,查看表t的索引信息
      • 基数的统计方法:
        • 采样统计的时候,InnoDB默认会选择N个数据页,统计这些页面上的不同值,得到一个平均 值,然后乘以这个索引的页面数,就得到了这个索引的基数
        • 当变更的数据行数超过1/M的 时候,会自动触发重新做一次索引统计
      • 存储统计的方式,通过设置参数innodb_stats_persistent的值来选择
        • 设置为on的时候,表示统计信息会持久化存储。这时,默认的N是20,M是10
        • 设置为off的时候,表示统计信息只存储在内存中。这时,默认的N是8,M是16。
      • 随着表不停的插入删除,统计的基数信息可能不对有较大误差,可以执行analyze table t,重新统计

        执行器

  • 先判断是否有表的操作权限

  • 调用引擎接口进行真正的操作
  • 返回结果

    存储引擎层

    功能

  • 负责数据的存储和读取

  • 插件架构模式
    • InnoDB
    • MyISAM
    • Memory