MySQL基础架构
- MySQL架构可大体分为Server层和存储引擎两个部分
- Server层可分为连接器,分析器,优化器
- 存储引擎层负责数据的存储和提取。其架构模式是插件式的,需要在建表的时候,指定你需要的存储引擎,默认是Innodb。
连接器
- 连接器负责跟客户端建立连接、获取权限、维持和管理连接。
- 用户登录成功后连接器会查询权限表,后续操作均依赖此时的权限,若该用户后续权限变化需重新登录
- 连接默认时间为8小时,这个时间是由参数wait_timeout控制。
- 使用showprocesslist可以查看连接
- 连接类型分为长连接和短连接
- 短连接:每次执行完很少的几次查询就断开连接,下次查询再重新建立一个
- 长连接:连接成功后,如果客户端持续有请求,则一直使用同一个连接
如何解决长连接占用大量资源?
MySQL在执行过程中临时使用的内存是管理在连接对象里面的。这些资源会在连接断开的时候才释放
- 定时或在大查询后断开连接
- MySQL5.7版本后使用mysql_reset_connection命令,该命令不需要重连和重新做权限验证,会使连接恢复到刚创建完的状态
查询缓存
- 缓存通过Key-Value 进行存储,key是查询的语句,value是查询的结果
- 查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空。不建议使用
- 表更新后,该表缓存将会被清空,仅建议在静态表(长期不更新)使用
- 将参数query_cache_type设置成DEMAND,这样对于默认的SQL语句都不使用查询缓存
- 显示使用缓存:select SQL_CACHE * from T where ID=10;
- MySQL8.O之后版本已移除缓存
分析器
- 词法分析:MySQL需要识别出里面的字符串分别是什么,代表什么
- MySQL从你输入的"select"这个关键字识别出来,这是一个查询语句。它也要把字符串“T”识别 成“表名T”,把字符串“ID”识别成“列ID”。
- 语法分析:检查输入语句是否符合MySQL语法标准
优化器
- 决定使用哪个索引
- 决定表如何 join,哪个表用来join,哪个表用来被连接
- 决定执行的方案
执行器
- 验证权限
- 根据表的引擎定义,去使用这个引擎提供的接口
- 慢查询日志中看到一个rows_examined的字段,表示这个语句执行过程中扫描了多少行。
- 在有些场景下,执行器调用一次,在引擎内部则扫描了多行,因此引擎扫描行数跟rows_examined并不是完全相同的。