存储架构图
整体架构图
Server层
主要功能
- 内置函数:日期、时间、数学和加密函数等
-
连接器
负责跟客户端建立连接、获取权限、维持管理连接
- 首先进行TCP握手,其次验证账号密码
- 而后从权限表读取账号权限,这个连接里面的权限判断逻辑,都将依赖于此时读到的权限。
- show processlist,查看数据库连接信息,Command列为Sleep表示是空闲连接
- Sleep状态的连接,默认8小时断开,由参数wait_timeout控制
- MySQL在执行过程中临时使用的内存是管理在连接对象里面的,这些资源会在连接断开的时候 才释放
Mysql5.7后,可以在每次执行一个比较大的操作后,通过执行 mysql_reset_connection来重新初始化连接资源。这个过程不需要重连和重新做权限验证, 但是会将连接恢复到刚刚创建完时的状态。
查询缓存
对于查询操作,会先到查询缓存中找结果,执行过的查询操作会以key-value的形式缓存在内存中,key是查询语句
- 查询缓存失效非常频繁。对一个表的更新操作,会清空这个表的所有查询缓存
- MySQL8.0删除了查询缓存这个模块
手动关闭:
对SQL进行语法分析,识别每个字符串的含义
-
优化器
优化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
